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

时间:2014-08-04 23:53:19

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

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

所以事情是:

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

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

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

  3. 我写完所有音频样本。

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

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

1 个答案:

答案 0 :(得分:2)

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

  

错误0xC00D4A45:Sink无法创建有效的输出文件,因为   所需的标题未提供给接收器。

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

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

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

可以使用其他一些格式,但在创建接收器之前配置属性时,必须使用MF_MT_MPEG4_SAMPLE_DESCRIPTION GUID手动提供示例说明框(stsd)说明。这是使用以下功能完成的:

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

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

希望这有帮助。

编辑:

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

与音频相关,例如,如果您选择MFAudioFormat_PCMMP4 File Source会在媒体类型部分中列出5个条目。因此,请使用相应的示例输入代码(' raw',' sowt',' twos',' NONE',0x00)在构建示例描述框时。请注意' raw'中的空格。高级摘要如下:

//  '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