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

Posted

技术标签:

【中文标题】对 Windows Media Foundation AAC 编码器的多通道支持【英文标题】:multichannel support for Windows Media Foundation AAC encoder 【发布时间】:2015-07-02 04:18:50 【问题描述】:

我正在编写一个使用 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 上。

【问题讨论】:

【参考方案1】:

原装 Windows 7 AAC 编码器did not have support for 5.1 audio。后来在更新的操作系统版本(Windows 8 或 8.1)中添加了它。 MSDN 文章没有提到这一点。

【讨论】:

我无法在最新的 Windows 10 上完成这项工作。每当我调用 writer->SetInputMediaType(index, pMediaTypeIn, nullptr) 时都会失败。根据官方文档,没有 我想这仍然是可能的,尽管可能很棘手。例如,媒体类型可能必须具有良好的通道掩码。我想说可以尝试从有效的 WAVEFORMATEXTENSIBLE 为此类类型创建媒体类型和/或查看 5.1 AAC 的解码器建议。我会说,如果充分关注这些细节,5.1 编码器就会起飞。

以上是关于对 Windows Media Foundation AAC 编码器的多通道支持的主要内容,如果未能解决你的问题,请参考以下文章

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

找不到 System.Windows.Media 命名空间?

Windows Media 基础:如何设置编码器属性?

Windows Phone 8.1 Media Foundation H264 最大分辨率

使用 System.Media.SoundPlayer 播放 Windows 系统声音

怎么用windows media player