c++ - 无法使用 Media Foundation 的 sinkwriter 将音频流添加到 MP4 文件

标签 c++ audio mp4 h.264 ms-media-foundation

自从我试图让我的编码器工作以来已经一周了......

所以事情是:

  1. 我使用 MF 中的 Sink Writer 创建了一个文件。

  2. 我写了我所有的视频样本。

    -->(如果我停在那里并调用 Finish 方法,我可以使用 VLC 读取文件,但如果我执行以下操作,文件将“损坏”)

  3. 我写了我所有的音频样本。

  4. 我调用 finish 函数并得到一个 HRESULT 代码:“接收器无法创建有效的输出文件,因为所需的 header 未提供给接收器”。我完全理解这个错误,只是我不知道如何解决它...

如果你们需要任何代码,我很乐意把它放在这里。

最佳答案

当我第一次开始使用 MP4 容器时(在完成接收器时),我遇到了这个确切的错误。

Error 0xC00D4A45: Sink could not create valid output file because required headers were not provided to the sink.

您没有提到您正在为接收器提供什么子类型的音频样本,也没有提到添加了什么子类型的音频流(用于输出),但我相信您的问题与后者有关。

使用媒体基础进行开发,使用 MFAudioFormat_AACMFAudioFormat_MP3 最容易配置 MP4 容器。如果您查看 MP4 File Sink 的详细信息在这link ,您将看到接收器可以为以下格式生成示例描述框 (stsd):

- H.264/AVC video
- AAC audio
- MP3 audio

可以使用一些其他格式,但是您必须使用 MF_MT_MPEG4_SAMPLE_DESCRIPTION 手动提供样本描述框 (stsd) 描述在创建接收器之前配置属性时的 GUID。这是使用以下函数完成的:

// IMFAttributes::SetBlob
attributes->SetBlob(MF_MT_MPEG4_SAMPLE_DESCRIPTION, buffer, buffer_size);

但是,很少有其他类型可以使用,如 MP4 File Source here 所述.在媒体类型 下,有一个包含各种允许类型的表格。除了前面提到的 AAC/MP3 之外,剩下的音频类型很少,而且没有一个是非常有吸引力的选择。您会发现坚持使用 MFAudioFormat_AACMFAudioFormat_MP3 对您很有帮助。

希望这对您有所帮助。

编辑:

如果您选择使用 AACMP3 以外的音频子类型,并使用 IMFAttributes 提供 MF_MT_MPEG4_SAMPLE_DESCRIPTION 配置::SetBlob示例描述框 (stsd) 在this answer 中有描述.正如该答案所述,这些框是嵌套的。

关于音频,例如,如果您选择MFAudioFormat_PCMMP4 File SourceMedia Types 部分列出了 5 个条目。因此,在构建示例描述框时,请使用适当的示例输入代码(“raw”、“sowt”、“twos”、“NONE”、0x00)。注意“原始”中的空格。高级摘要如下:

//  'raw '  Audio   MFAudioFormat_PCM   8-bit PCM audio
//  'sowt'  Audio   MFAudioFormat_PCM   16-bit little-endian PCM audio
//  'twos'  Audio   MFAudioFormat_PCM   16-bit big-endian PCM audio
//  'NONE'  Audio   MFAudioFormat_PCM   8-bit or 16-bit big-endian PCM audio
//   0x00   Audio   MFAudioFormat_PCM   8-bit or 16-bit big-endian PCM audio

您还可以找到 these registered codecs interesting .

关于c++ - 无法使用 Media Foundation 的 sinkwriter 将音频流添加到 MP4 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129263/

相关文章:

python - 如何在 Python 中导入 caffe 模块?

javascript - .wav音频文件将无法播放-Javascript

c# - 上传任何视频并在 .net 中在线转换为 .mp4

c++ - 模拟对象问题

C++ 结构值丢失

java - 在Java中使用.wav格式循环播放音频文件

c# - 交换文件中的字节

java - 如何在 Java Swing 应用程序中播放 MP4 视频

ffmpeg - 如何将 mkv 电影转换为 mp4 以流式传输到 Xbox 360

c++ - 具有文件处理和 istringstreams 的无限循环