我正在使用Windows Media Foundation AAC编码器编写程序来编码音频 . 根据此处的文档 - AAC Encoder - 支持6个通道 . 但在我的程序中,当我将其设置为6时,我将收到MF_E_INVALIDMEIDATYPE错误 . 以下是我的代码
CLSID* pCLSIDs = NULL;// Pointer to an array of CLISDs.
UINT32 nCount = 0;
MFT_REGISTER_TYPE_INFO encoderInfo;
encoderInfo.guidMajorType = MFMediaType_Audio;
encoderInfo.guidSubtype = MFAudioFormat_AAC;// AAC Encoder class id is not exposed, so we have to enumerate
HRESULT hr = fpMFTEnum(MFT_CATEGORY_AUDIO_ENCODER, 0, NULL, &encoderInfo, NULL, &pCLSIDs, &nCount);
ciEncoder.CreateObject(pCLSIDs[0], IID_IMFTransform);
LComObject<IMFMediaType> ciInputType; // Input media type of the encoder
hr = fpMFCreateMediaType((IMFMediaType**)(ciInputType.GetAssignablePtrRef()));
hr = ciInputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
hr = ciInputType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_PCM);
hr = ciInputType->SetUINT32(MF_MT_AUDIO_BITS_PER_SAMPLE, 16); // must be 16
hr = ciInputType->SetUINT32(MF_MT_AUDIO_SAMPLES_PER_SECOND, Samplerate);
hr = ciInputType->SetUINT32(MF_MT_AUDIO_NUM_CHANNELS, Channels); //Must be 1 (mono)or 2 (stereo), or 6 (5.1).
hr = ciEncoder->SetInputType(0, ciInputType.get(), 0);
if (FAILED(hr)) {
LDEBUG("Failed to set encoder input meida type");
break;
}
我删除了所有错误处理代码,请忽略我在COM对象上的包装器 .
当Channels == 6时,ciEncoder-> SetInputType()将失败 . 但是当Channels == 1或2时,SetInputType成功 . 它发生在32位和64位Win7 Professional上 .
1 回答
原始Windows 7 AAC编码器did not have support for 5.1 audio . 稍后在较新的操作系统版本(Windows 8或8.1)中添加了它 . MSDN文章没有提到这一点 .