使用 Sink Writer 编码音频
Encode Audio using Sink Writer
我发现 this 一篇解释如何使用 Media Foundation 对视频进行编码的文章。
我正在尝试使用上述link中使用的原理对音频进行编码。
我无法为接收器编写器设置正确的输入媒体类型。
这是那部分:
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.
最重要的是,在调用 SetMediaType 之前,您需要在 Sink Writer 上调用 AddStream,如果您需要编码,则通过调用具有 MFAudioFormat_AAC 子类型的 MFTranscodeGetAudioOutputAvailableTypes 函数枚举输出音频类型AAC 格式的音频。
MFCreateSinkWriterFromURL 可能无法猜测您需要从 m4a 扩展名编码到 mp4 容器。调用 MFCreateSinkWriterFromURL 时,您可能需要使用 MF_TRANSCODE_CONTAINERTYPE 属性提供 MFTranscodeContainerType_MPEG4 容器类型。另一种选择是改用 MFCreateMPEG4MediaSink 和 MFCreateSinkWriterFromMediaSink。
我发现 this 一篇解释如何使用 Media Foundation 对视频进行编码的文章。
我正在尝试使用上述link中使用的原理对音频进行编码。
我无法为接收器编写器设置正确的输入媒体类型。
这是那部分:
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.
最重要的是,在调用 SetMediaType 之前,您需要在 Sink Writer 上调用 AddStream,如果您需要编码,则通过调用具有 MFAudioFormat_AAC 子类型的 MFTranscodeGetAudioOutputAvailableTypes 函数枚举输出音频类型AAC 格式的音频。
MFCreateSinkWriterFromURL 可能无法猜测您需要从 m4a 扩展名编码到 mp4 容器。调用 MFCreateSinkWriterFromURL 时,您可能需要使用 MF_TRANSCODE_CONTAINERTYPE 属性提供 MFTranscodeContainerType_MPEG4 容器类型。另一种选择是改用 MFCreateMPEG4MediaSink 和 MFCreateSinkWriterFromMediaSink。