读取第二个音轨流从mp4文件使用SharpDx或IMSourceReader

本文关键字:SharpDx IMSourceReader 文件 mp4 第二个 音轨 读取 | 更新日期: 2023-09-27 17:50:22

我在我的应用程序中有一个要求,我必须从mp4文件中读取所有可用的轨道流。

Mp4文件以AAC格式编码曲目数。我得解码才能从文件中找到所有可用的音轨。目前我正在使用SharpDX和IMSourceReader (Media Foundation dll)来读取流。但是默认情况下,SourceReader只返回文件中的第一个音频流。我做的对吗?或者我必须使用任何其他第三方库来实现这一点?

读取第二个音轨流从mp4文件使用SharpDx或IMSourceReader

在配置阅读器时,您可以选择读取样本时将发送哪些流。通常情况下,您不希望选择流。例如,一部电影有额外的音频流(西班牙语、法语或导演评论)。因此,大多数时间流选择都像下面这样简单:

// error checking omitted for brevity
hr = reader->SetCurrentMediaType((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, nullptr, audioMediaType);
hr = reader->SetStreamSelection((DWORD)MF_SOURCE_READER_FIRST_AUDIO_STREAM, true);

然而,如果你看一下SetStreamSelection,第一个参数要么接受上面使用的枚举,要么接受一个特定的流索引。

// 0–0xFFFFFFFB  <-- The zero-based index of a stream.
//   0xFFFFFFFC  <-- MF_SOURCE_READER_FIRST_VIDEO_STREAM
//   0xFFFFFFFD  <-- MF_SOURCE_READER_FIRST_AUDIO_STREAM
//   0xFFFFFFFE  <-- MF_SOURCE_READER_ALL_STREAMS
//   0xFFFFFFFE  <-- MF_SOURCE_READER_ANY_STREAM
//   0xFFFFFFFF  <-- MF_SOURCE_READER_INVALID_STREAM_INDEX

我从未使用过SharpDX,但是这里记录了这个枚举。与视频有关,有时可以使用额外的视频流(通常是封闭字幕)。

读取样本时,使用回调或同步,密切关注流索引,并相应地处理样本。

你可能也会发现这些答案很有价值或很有趣:
聚合媒体源
MP4 IMFSinkWriter
添加音频样本到视频
创建NV12编码视频
IMFSinkWriter配置
IMFSinkWriter CPU利用率