对 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 Phone 8.1 Media Foundation H264 最大分辨率