C++ can';使用来自媒体基金会的SnkWror向MP4文件添加音频流

C++ can';使用来自媒体基金会的SnkWror向MP4文件添加音频流,c++,audio,mp4,h.264,ms-media-foundation,C++,Audio,Mp4,H.264,Ms Media Foundation,我已经有一周没有试着让我的编码器工作了 所以情况是: 我使用MF中的Sink Writer创建了一个文件 我写了我所有的视频样本 -->(如果我停在那里并调用Finish方法,我可以使用VLC读取文件,但如果我执行下面的操作,文件将“损坏”) 我写了我所有的音频样本 我调用finish函数,得到一个HRESULT代码,上面说:“接收器无法创建有效的输出文件,因为没有向接收器提供所需的头。”。我完全理解错误,只是我不知道如何解决它 如果你们需要任何代码,我很乐意把它放在这里。我第一次开始使用MP4

我已经有一周没有试着让我的编码器工作了

所以情况是:

  • 我使用MF中的Sink Writer创建了一个文件

  • 我写了我所有的视频样本

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

  • 我写了我所有的音频样本

  • 我调用finish函数,得到一个HRESULT代码,上面说:“接收器无法创建有效的输出文件,因为没有向接收器提供所需的头。”。我完全理解错误,只是我不知道如何解决它


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

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

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

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

    随着媒体基础的发展,MP4容器最容易被配置为使用<代码> MfIdCopyMataA/<代码>或<代码> MfIdCopyMatLMP3/<代码>。如果查看此处的详细信息,您将看到接收器可以为以下格式生成示例描述框(stsd):

    - H.264/AVC video
    - AAC audio
    - MP3 audio
    
    可以使用一些其他格式,但是在创建接收器之前,在配置属性时,您必须使用GUID手动提供示例描述框(stsd)描述。这是使用以下功能完成的:

    // IMFAttributes::SetBlob
    attributes->SetBlob(MF_MT_MPEG4_SAMPLE_DESCRIPTION, buffer, buffer_size);
    
    但是,如所述,可以使用的其他类型很少。在介质类型下,有一个包含各种允许类型的表格。除了前面提到的AAC/MP3之外,剩下的音频类型很少,没有一种是非常有吸引力的选择。你会发现坚持使用
    MFAudioFormat\u AAC
    MFAudioFormat\u MP3
    会对你有好处

    希望这有帮助

    编辑:

    如果您选择使用除
    AAC
    MP3
    之外的音频子类型,并使用
    IMFAttributes::SetBlob
    提供
    MF\u MT\u MPEG4\u示例描述
    配置,则示例描述框(stsd)如中所述。正如该答案所述,框是嵌套的

    关于音频,例如,如果要选择
    MFAudioFormat_PCM
    ,请在媒体类型部分列出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
    

    您也可以找到。

    谢谢您,我现在没有项目,但我以后一定会尝试。只是询问一下,你能解释一下你是如何初始化和设置“缓冲区”的吗<代码>属性->SetBlob(MF\u MT\u MPEG4\u样本描述、缓冲区、缓冲区大小)当然可以。您打算使用什么类型的音频?我将使用您的音频子类型格式化示例。我将使用MFAudioFormat_AAC,我发现它总体上质量更好。我现在已经在PCM中设置了音频,但是转换起来会很容易。我想如果使用MFAudioFormat_AAC,那么IMFAttributes::SetBlob是不必要的,因为接收器可以自动生成描述(如上所述)。对于基本配置,选择采样率为44100、16 bps和2个通道的子类型。但是任何AAC选择都将顺利完成,而不需要IMFAttributes::SetBlob.Hum,好吧,如果我想直接使用WAV PCM呢?可能吗?