自从我试图让我的编码器工作以来已经过了一周......
所以事情是:
我使用MF的Sink Writer创建一个文件。
我写了我的所有视频样本。
- > (如果我停在那里并调用Finish方法,我可以使用VLC读取文件,但如果我执行下面的操作,则文件将被"损坏")
我写完所有音频样本。
我调用了finish函数,我得到一个HRESULT代码说:" Sink无法创建有效的输出文件,因为未向接收器提供所需的标题"。我完全理解错误,只是我不知道如何解决它......
如果你们需要任何代码,我很乐意把它放在这里。
答案 0 :(得分:2)
当我第一次开始使用MP4容器时(在最终确定接收器时),我遇到了这个确切的错误。
错误0xC00D4A45:Sink无法创建有效的输出文件,因为 所需的标题未提供给接收器。
你没有提到你要为接收器提供什么子类型的音频样本,也没有提到添加了什么子类型的音频流(用于输出),但我相信你的问题是后者
使用媒体基础进行开发,使用MFAudioFormat_AAC
或MFAudioFormat_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_AAC
或MFAudioFormat_MP3
会很好地为您服务。
希望这有帮助。
编辑:
如果您选择使用AAC
或MP3
以外的音频子类型,并使用MF_MT_MPEG4_SAMPLE_DESCRIPTION
提供IMFAttributes::SetBlob
配置,示例说明框(stsd)在this answer中有所描述。正如答案所述,盒子是嵌套的。
与音频相关,例如,如果您选择MFAudioFormat_PCM
,MP4 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