使用Sink Writer编码音频

时间:2016-11-05 15:19:52

标签: c++ audio video-encoding ms-media-foundation

我找到了this文章,解释了如何使用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);

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

任何帮助,如何处理?

感谢。

1 个答案:

答案 0 :(得分:2)

您还需要在媒体类型中提供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。

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

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