首页 > 解决方案 > 如何通过 activatableClassId 将进程内 IMFTransform 与 WinRT MediaPlayer::AddVideoEffect 一起使用

问题描述

WinRT 的Windows::Media::Playback::MediaPlayer支持添加视频和音频效果(很像IMFMediaEngine),但是我找不到在MediaPlayer中使用我已经与IMFMediaEngineEx::InsertVideoEffect()一起使用的现有 IMFTransform 的方法::AddVideoEffect()

MediaPlayer::AddVideoEffect() 只接受一个字符串作为“activatableClassId”,而 IMFMediaEngineEx::InsertVideoEffect() 允许我直接传递一个指向本地 IMFTransform 的指针。我不想在系统中注册一个 DLL 以使该类可激活,我只想在本地进程中注册 IMFTransform,以便它可以被 classId 发现。

我在网上搜索过,但信息很少。我发现的只是这个Microsoft 线程,一篇显示使用 WRL的CGreyScale MFT的旧文章,以及这个有用的存储库,它使用 appxmanifest 来注册类(不是我想做的)。

这些示例看起来很有用,我在现有 MFT 周围实现了装饰,但是该示例依赖于在外部注册 activatableClassId,因此我仍然不知道如何在进程中进行。我唯一能找到的是RoRegisterActivationFactories () 但关于此的信息很少,所以我不确定。

有谁知道如何做到这一点?

谢谢,

标签: windows-runtimems-media-foundationc++-winrt

解决方案


由于 MediaPlayer API 是 WinRT,因此它将期望使用 WinRT 激活的对象来实现效果。或者,较低级别的 win32 MF 媒体引擎允许您传入 IMFActivate 以进行任何自定义激活。

使用 WinRT 激活 MFT 有两种方法:

  1. 将 MFT 注册到注册表并引用 CLSID,可以参考这个文档

  2. 免注册 WinRT(需要使用应用程序清单),您可以参考此博客

不幸的是,这意味着如果您希望在进程中注册 MFT,则有一个 appmanifest 要求。


推荐阅读