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

Posted

技术标签:

【中文标题】使用 SharpDx 或 IMSourceReader 从 mp4 文件中读取第二个音轨流【英文标题】:Read Second audio track stream from mp4 file using SharpDx or IMSourceReader 【发布时间】:2015-05-22 13:55:35 【问题描述】:

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

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

【问题讨论】:

仅供参考,尝试使用 SDK topoedit 应用程序打开具有多个音轨的 MP4,我看到 Media Foundation 绝对能够读取多个音轨。 如果是。你能分享一下用于读取音轨数量的代码吗? 我没有代码 - Topoedit 显示它是可能的,所以你可以查看 SharpDX 为什么它没有被拾取(SharpDX 只选择第一个音轨并跳过其余的?)。跨度> 【参考方案1】:

在配置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 SourceMP4 IMFSinkWriterAdding Audio Sample to VideoCreating NV12 Encoded VideoIMFSinkWriter ConfigurationIMFSinkWriter CPU Utilization /p>

我希望这会有所帮助。

【讨论】:

以上是关于使用 SharpDx 或 IMSourceReader 从 mp4 文件中读取第二个音轨流的主要内容,如果未能解决你的问题,请参考以下文章

SharpDX 2D 的 DirectX 2d WinForm 设置

SharpDX初学者教程第1部分:在Visual Studio 2013中设置SharpDX项目

SharpDX/DX11 Alpha 混合

SharpDX/SolidColorBrush 构造函数与 DeviceContext?

Unity 中的 SharpDX.Direct 输入

SharpDx:无法从“System.IntPtr”转换为“SharpDX.MediaFoundation.IByteStream”