使用SharpDx或IMSourceReader

时间:2015-05-22 13:55:35

标签: c# audio sharpdx ms-media-foundation

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

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

1 个答案:

答案 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。 与视频有关,有时可以使用其他视频流(通常是隐藏式字幕)。

使用callbacksynchronously阅读样本时,请密切注意流索引,并相应处理样本。

您可能还会发现这些答案有价值或有趣:
  Aggregate Media Source
  MP4 IMFSinkWriter
  Adding Audio Sample to Video
  Creating NV12 Encoded Video
  IMFSinkWriter Configuration
  IMFSinkWriter CPU Utilization

我希望这会有所帮助。