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

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

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

【问题讨论】:

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

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


【解决方案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。 对于视频,有时可以使用额外的视频流(通常是隐藏式字幕)。

在读取样本时,使用callbacksynchronously,密切关注流索引,并相应地处理样本。

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

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2023-03-25
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多