【问题标题】:MFTEnumEx cannot find MFAudioFormat_MP3 decoder on Windows 7?MFTEnumEx 在 Windows 7 上找不到 MFAudioFormat_MP3 解码器?
【发布时间】: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 一起为这个问题提供了一个很好的答案

标签: c++ winapi audio ms-media-foundation


【解决方案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 调用表明您请求跳过异步。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2013-06-08
    • 1970-01-01
    • 2015-01-16
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多