【发布时间】: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