Windows Media Foundation AAC 编码器的多声道支持

multichannel support for Windows Media Foundation AAC encoder

我正在编写一个程序,使用 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 对象的包装。

ciEncoder->SetInputType() 将在 Channels == 6 时失败。但是当 Channels == 1 或 2 时,SetInputType 会成功。它发生在 32 位和 64 位 Win7 Professional 上。

原始 Windows 7 AAC 编码器 did not have support for 5.1 audio。它是后来添加到较新的 OS 版本(Windows 8 或 8.1)中的。 MSDN 文章没有提到这个。