我的应用程序中有一个要求,我必须从mp4文件中读取所有可用的曲目流。
Mp4文件使用AAC格式的轨道数进行编码。我必须解码以从文件中获取所有可用的曲目。目前我正在使用SharpDX和IMSourceReader(Media Foundation dlls)来读取Streams。但默认情况下,SourceReader仅返回文件中的第一个音频流。我做得对吗?或者我必须使用任何其他第三方库来实现这一目标?
答案 0 :(得分:0)
配置reader时,您可以选择在读取样本时将传送的流。通常,您不希望选择流。一个例子是具有附加音频流的电影(西班牙语,法语或者导演评论)。因此,大多数时间流选择都如下所示:
// 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,但此枚举记录在案here。 与视频有关,有时可以使用其他视频流(通常是隐藏式字幕)。
使用callback或synchronously阅读样本时,请密切注意流索引,并相应处理样本。
您可能还会发现这些答案有价值或有趣:
Aggregate Media Source
MP4 IMFSinkWriter
Adding Audio Sample to Video
Creating NV12 Encoded Video
IMFSinkWriter Configuration
IMFSinkWriter CPU Utilization
我希望这会有所帮助。