2016-11-05 70 views
0

我发现this文章,解释如何使用媒体基础编码视频。使用接收器编码器编码音频

我想使用上述链接中使用的原则对音频进行编码。

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

下面是部分:在最后一行

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

你是如何创建SinkWriter的?你尝试过使用MFAudioFormat_PCM吗? – VuVirt

+0

MFCreateSinkWriterFromURL(L“output.m4a”,NULL,NULL,&pSinkWriter); 是的,我已经尝试PCM和浮动。他们不能设置 – mbaros

+1

我认为你还需要在媒体类型中提供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。 – VuVirt

回答

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。

最重要的事情是,你需要调用AddStream在水槽作家,呼吁SetMediaType之前,通过调用列举到MFTranscodeGetAudioOutputAvailableTypes功能与MFAudioFormat_AAC亚型,如果你需要对音频编码为AAC的音频输出类型。

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

+0

只是一个评论。 MFCreateSinkWriterFromURL能够从输出名称中猜出正确的容器。 – mbaros