我第一次开始使用 MP4 容器时遇到了这个确切的错误(在完成接收器时)。
错误 0xC00D4A45:接收器无法创建有效的输出文件,因为
未向接收器提供所需的标头。
您没有提及您为接收器提供的音频样本的子类型,也没有提及添加的音频流的子类型(用于输出),但我相信您的问题与后者有关。
使用媒体基础开发,MP4 容器最容易使用MFAudioFormat_AAC 或MFAudioFormat_MP3 进行配置。如果您在此link 查看MP4 File Sink 的详细信息,您将看到接收器可以生成以下格式的示例描述框(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_AAC 或MFAudioFormat_MP3 对你有好处。
希望这会有所帮助。
编辑:
如果您选择使用AAC 或MP3 以外的音频子类型,并使用IMFAttributes::SetBlob 提供MF_MT_MPEG4_SAMPLE_DESCRIPTION 配置,则示例描述框 (stsd) 为在this answer 中描述。正如该答案所述,这些框是嵌套的。
关于音频,例如,如果您选择MFAudioFormat_PCM,MP4 File Source 在媒体类型部分列出 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。