Nox*_*Nox 5 c++ audio mp4 h.264 ms-media-foundation
我试图让我的编码器工作已经一周了......
所以事情是:
我使用 MF 的 Sink Writer 创建一个文件。
我写了所有的视频样本。
--> (如果我停在那里并调用 Finish 方法,我可以使用 VLC 读取该文件,但如果我执行以下操作,该文件将被“损坏”)
我写了所有的音频样本。
我调用完成函数,得到一个 HRESULT 代码:“接收器无法创建有效的输出文件,因为未向接收器提供所需的标头”。我完全理解这个错误,只是我不知道如何解决它......
如果你们需要任何代码,我很乐意将其放在这里。
当我第一次开始使用 MP4 容器时(在完成水槽后),我遇到了这个确切的错误。
错误 0xC00D4A45:接收器无法创建有效的输出文件,因为未向接收器提供所需的标头。
您没有提到您正在向接收器提供哪种音频样本子类型,也没有提到添加了哪种音频流子类型(用于输出),但我相信您的问题在于后者。
使用媒体基础进行开发,MP4 容器最容易使用MFAudioFormat_AAC或进行配置MFAudioFormat_MP3。如果您在此链接查看MP4 文件接收器的详细信息,您将看到该接收器可以生成以下格式的示例描述框(stsd):
- H.264/AVC video
- AAC audio
- MP3 audio
Run Code Online (Sandbox Code Playgroud)
可以使用一些其他格式,但是在创建接收器之前配置属性时,您必须使用 GUID手动提供示例描述框(stsd) 描述。MF_MT_MPEG4_SAMPLE_DESCRIPTION这是使用以下函数完成的:
// IMFAttributes::SetBlob
attributes->SetBlob(MF_MT_MPEG4_SAMPLE_DESCRIPTION, buffer, buffer_size);
Run Code Online (Sandbox Code Playgroud)
但是,可以使用的其他类型很少,如此处的MP4 文件源所述。在Media Types下,有一个包含各种允许类型的表。除了前面提到的 AAC/MP3 之外,剩下的音频类型很少,而且都不是非常有吸引力的选择。你会发现坚持MFAudioFormat_AAC或坚持MFAudioFormat_MP3会对你有好处。
希望这可以帮助。
编辑:
AAC如果您选择使用或以外的音频子类型MP3,并MF_MT_MPEG4_SAMPLE_DESCRIPTION使用 提供配置IMFAttributes::SetBlob,则此答案中描述了示例描述框(stsd) 。正如该答案所述,这些框是嵌套的。
以音频为例,如果选择MFAudioFormat_PCM,MP4 文件源会在媒体类型部分列出 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
Run Code Online (Sandbox Code Playgroud)
您可能还会发现这些已注册的编解码器很有趣。