C++ 使用媒体基础API禁用特定解码器

C++ 使用媒体基础API禁用特定解码器,c++,.net,ms-media-foundation,C++,.net,Ms Media Foundation,我有一个嵌入了Windows Media Player的项目。使用媒体基础API < /代码>,我如何禁用MP4和MKV文件格式?因此,Windows Media Player将使用第三方解码器代替mp4和mkv文件格式。(在我的例子中是FFDSHOW,我想用它的H264解码器来解码mp4和mkv文件格式,而不是Media Foundation解码器) 我听说有一个第三方软件名为“代码>编解码器TWIP工具”,它可能是使用媒体基础API < /代码>来实现的。 使用Codec-Tweak工具和W

我有一个嵌入了Windows Media Player的项目。使用<代码>媒体基础API < /代码>,我如何禁用MP4和MKV文件格式?因此,Windows Media Player将使用第三方解码器代替mp4和mkv文件格式。(在我的例子中是
FFDSHOW
,我想用它的
H264
解码器来解码mp4和mkv文件格式,而不是
Media Foundation
解码器)

我听说有一个第三方软件名为“代码>编解码器TWIP工具”,它可能是使用<代码>媒体基础API < /代码>来实现的。 使用
Codec-Tweak工具
和Win-registry调试器,我找到了一些注册表目录,这些目录可能与
Media-Foundation
有关

我试图更改以下Win注册表目录中的注册表:
HKEY\U LOCAL\U MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Media Foundation\ByTestStreamHandlers\.mkv
(Windows 10 64位目录),但系统没有授予我权限,但使用注册表似乎是一种黑客方式来更改它,顺便说一下,我被拒绝了。我认为这样做不对。我听说我可以通过使用<代码>媒体基础API <代码>来实现,也许使用<代码>媒体基础转换或<代码>源解析器< /C>,但是我不知道如何设置一个适当的对象,并用API接口来做这样的事情。然而,我知道在禁用它之后,我应该设置一个首选的directShow解码器,例如
FFDSHOW
,这样它就可以代替
Media Foundation
,用于我想禁用的各个文件格式

在使用
Codec-Tweak-Tool
更改
H264
首选解码器后,我发现在设置首选directShow解码器后更改了哪些注册表

密钥目录:
HKLM\SOFTWARE\WOW6432Node\Microsoft\DirectShow\Preferred
(Windows 10 64位目录)

已更改的注册表:

{31435641-0000-0010-8000-00AA00389B71}
{34363248-0000-0010-8000-00AA00389B71}
{34363268-0000-0010-8000-00AA00389B71}
并将以下
FFDSHOW
CLSID
应用于它们中的每一个:
{04FE9017-F873-410E-871E-AB91661A4EF7}

我还注意到设置首选解码器需要
CLSID


我得出结论,使用注册表绝对不是实现这一目标的正确方法,那么如何使用<代码>媒体基金会API <代码>来实现这一点?我已经读过了,但是由于它的低层次和复杂性,它对我来说似乎很混乱。

你可以尝试使用一个自定义的字节流处理程序,使用MFRIGYSTRUSTALYBYTESTRAW处理程序,但是你必须有一个COM对象,它知道如何使用MediaFoundation。例如,不能使用exe@SimonMourier谢谢你的提醒。我注意到一个指向
IMFActivate
接口的指针,但是我不知道是什么COM对象实现了这个接口,你能举一个例子说明如何实例化这个COM对象并将这个接口传递给
MFRegisterLocalByteStreamHandler
函数吗?我不知道任何正式的示例,但这里有一个(但都是一样的东西)@ SimonMourier非常感谢你的例子,它提供了一个很好的想法,如何实现它,但是,因为它是在C中,我有很多工作要做,以转换它到C++还提供MP4处理程序,注意到我需要很多项目的类,那些是与实现它相关的很多文件,所以我看不到一个简单的答案。他的问题。实际上,如果你没有一个已经可用的流处理程序,这是一个相当不错的工作。你可以尝试使用一个自定义的字节流处理器使用MFrGyStRealAbjyType处理程序,但是你必须有一个COM对象来理解如何使用MediaFoundation。例如,你不能使用EXE。@ SimonMourier谢谢你的提醒。我注意到了一个P。指向
IMFActivate
接口,但是我不知道是什么COM对象实现了该接口,您能否展示一个示例,说明如何实例化该COM对象并将该接口传递给
MFRegisterLocalByteStreamHandler
函数?不知道任何官方示例,但这里有一个(c#但它是相同的东西)@ SimonMourier非常感谢你的例子,它提供了一个很好的想法,如何实现它,但是,因为它是在C中,我有很多工作要做,以转换它到C++还提供MP4处理程序,注意到我需要很多项目的类,那些是与实现它相关的很多文件,所以我看不到一个简单的答案。事实上,如果你还没有一个可用的流处理程序,这是一项相当大的工作。