MFTEnumEx 在 Windows 7 上找不到 MFAudioFormat_MP3 解码器?

Posted

技术标签:

【中文标题】MFTEnumEx 在 Windows 7 上找不到 MFAudioFormat_MP3 解码器?【英文标题】:MFTEnumEx cannot find MFAudioFormat_MP3 decoder on Windows 7? 【发布时间】:2020-10-31 08:18:07 【问题描述】:

作为一个分支问题来自:IMFTransform SetInputType()/SetOutputType() fails

当我尝试在 Windows 7 上枚举 MP3 解码器时,找不到任何 MP3 解码器?但是,当我为 MFCreateSourceReaderFromURL 创建的 MP3 文件的 IMFSourceReader 设置部分媒体类型时,它似乎找到了。

我试过了:

MFT_REGISTER_TYPE_INFO outType MFMediaType_Audio, MFAudioFormat_Float ;   //  And MFAudioFormat_PCM, MFAudioFormat_Float
MFT_REGISTER_TYPE_INFO inType MFMediaType_Audio, MFAudioFormat_MP3 ;
IMFActivate** decoders;
UINT32 decoderCount;
HRESULT hr;

hr = MFTEnumEx(MFT_CATEGORY_AUDIO_DECODER, MFT_ENUM_FLAG_SYNCMFT, &inType, &outType, &decoders, &decoderCount);
SUCCEEDED(hr);

我相信我已经尝试了 MFTEnumEx 的所有不同标志,但 decoderCount 仍然为零?

【问题讨论】:

您请求了浮点输出格式。 Windows 7 解码器可能只做 PCM。你也可以省略它,只要求输入类型。 我尝试了 PCM 和浮点数(我的代码中的注释是为了表明这一点)。当我尝试使用 NULL 输出类型时,它确实找到了一个解码器,但正如您所怀疑的那样!我想在我的 IMFSourceReader 案例中,它会在幕后从它所做的任何输出格式进行一些转换。因此,您建议通过 MFTEnum 而不是 IMFSourceReader 部分媒体类型技巧来创建该解码器 - 因为这样我猜就可以向用户列出配置选项? 部分媒体类型是一种有据可查的方式,因此还不错。独立解码器的一个技巧是找到它并从中获取完全指定的媒体类型,然后与 Source Reader 一起使用。这通常对我来说看起来更可取,因为这样您可以对管道建设进行更多控制和更严格。但是,这只是拇指的作用,在您的情况下,部分可以工作,甚至可能更可取,因为这里省略了其他可能的原因。所以你有选择。 你的两个 cmets 一起为这个问题提供了一个很好的答案 【参考方案1】:

Windows 7 SP1 解码器:

MP3 解码器 MFT

MFT_TRANSFORM_CLSID_Attribute:BBEEA841-0A63-4F52-A7AB-A9B3A84ED38A(类型 VT_CLSID) MF_TRANSFORM_FLAGS_Attribute:MFT_ENUM_FLAG_SYNCMFT MFT_INPUT_TYPES_Attributes:MFAudioFormat_MP3 MFT_OUTPUT_TYPES_Attributes:MFAudioFormat_PCM

解码器不宣传支持MFAudioFormat_Float 进行解码(即使实例化它也可以支持它)。当您枚举将输出限制为MFAudioFormat_Float 的解码器时,将排除解码器。较新版本的操作系统可能已经更新了解码器,提供了更多输出格式选项。

如果你这样做:

MFT_REGISTER_TYPE_INFO outType MFMediaType_Audio, MFAudioFormat_PCM ;

nullptr输出媒体类型,解码器将被枚举。

一般来说,Source Reader API 也使用相同的MFTEnum 逻辑,以便将实际的源媒体类型与请求的媒体类型相匹配。

枚举时还要注意标志:精确选择同步 MFT 对您来说可能不是那么重要,但您的 API 调用表明您请求跳过异步。

【讨论】:

以上是关于MFTEnumEx 在 Windows 7 上找不到 MFAudioFormat_MP3 解码器?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 在 Windows 7 64 位机器上找不到 CIODMLib 项目参考

带有 IE11 的 Selenium 3.0.1 在 Windows 10 上找不到元素(在带有 IE11 的 Windows 7 上运行良好)

best_local_affine_kernel.cu [WinError 126] 在 Windows 10 上找不到指定的模块

在生产服务器上找不到 Dajaxice

如何枚举 Windows 8 上的媒体基础转换

Windows 在 subprocess.call() 上找不到文件