使用Sink Writer编码音频



我找到了一篇解释如何使用Media Foundation对视频进行编码的文章。

我正在尝试使用上述链接中使用的原理对音频进行编码。

我被困在设置一个正确的输入媒体类型的接收器写入器。

这是那部分:

if (SUCCEEDED(hr))
    hr = MFCreateMediaType(&pMediaTypeIn);
if (SUCCEEDED(hr))
    hr = pMediaTypeIn->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
if (SUCCEEDED(hr))
    hr = pMediaTypeIn->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_Float);
if (SUCCEEDED(hr))
    hr = pMediaTypeIn->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, cChannels);
if (SUCCEEDED(hr))
    hr = pMediaTypeIn->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, sampleRate);
if (SUCCEEDED(hr))
    hr = pSinkWriter->SetInputMediaType(streamIndex, pMediaTypeIn, NULL);

我的代码在最后一行设置输入媒体类型时失败。

请帮忙,如何处理这个问题?

谢谢。

您还需要在媒体类型中提供MF_MT_AUDIO_BITS_PER_SAMPLE。必须设置为16。在这里检查输入类型要求:https://msdn.microsoft.com/en-us/library/windows/desktop/dd742785(v=vs.85).aspx。采样率必须为44100或48000。子类型必须为MFAudioFormat_PCM。

最重要的是,如果你需要将音频编码为AAC,在调用SetMediaType之前,你需要调用Sink Writer上的AddStream,通过调用MFTranscodeGetAudioOutputAvailableTypes函数枚举输出音频类型。

MFCreateSinkWriterFromURL可能无法猜到您需要从m4a扩展编码到mp4容器。在调用MFCreateSinkWriterFromURL时,您可能需要使用MF_TRANSCODE_CONTAINERTYPE属性提供MFTranscodeContainerType_MPEG4包含类型。另一种选择是使用mfcreatatempeg4mediasink和MFCreateSinkWriterFromMediaSink。

最新更新