在 Windows 7 上加载视频处理器 MFT 时"Class not registered"



我有以下COM调用:

IMFTransform* pMFT = NULL;
HRESULT hr = CoCreateInstance(CLSID_VideoProcessorMFT, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pMFT));

在我的开发机器上,对CoCreateInstance的调用成功了。然而,当我在旧的Windows7机器上部署它时,对CCD_ 2的呼叫失败,我不知道为什么。以下是我显示错误的方式:

_com_error err(hr);
LPCTSTR hrErrMsg = err.ErrorMessage();
WCHAR msg[MAX_PATH];
StringCbPrintf(msg, sizeof(msg), L"HRESULT=0x%X, %s", errContext, hrErr, hrErrMsg);
MessageBox(hwnd, msg, L"Error", MB_ICONERROR);

这是我在信息框中得到的错误:

HRESULT=0x80040154, Class not registered

也就是说,视频处理器MFT的COM类未注册。我看到CLSID_VideoProcessorMFT被定义为:

EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);

这是伪装的GUID88753B26-5B24-49bd-B2E7-0C445C78C982。我知道COM类是在Windows注册表中用包含此GUID的键注册的。在我的开发人员机器上使用注册表编辑器,我可以看到密钥:

HKEY_LOCAL_MACHINESOFTWAREClassesCLSID{88753B26-5B24-49bd-B2E7-0C445C78C982}

并且该密钥具有"默认"值CCD_ 5,参考文件路径CCD_ 6,它确实存在。

在我的旧Windows 7计算机上,注册表中的此项不存在--如预期,给定"Class not registered"错误。并且在C:WindowsSystem32msvproc.dll处没有文件。但这就是线索变冷的地方。我不知道应该用什么在注册表中注册那个类,以及为什么它没有在我的旧Windows7机器上运行。

可能的结论:

  • 我必须自己注册视频处理器MFT。然而,这些文件并不建议这样做,我不知道该怎么做
  • Windows 7不支持视频处理器MFT。但这些文件没有提供任何迹象。事实上,他们说"媒体基金会需要Windows Vista或更高版本",应该包括我的Windows7机器
  • 我以错误的方式加载视频处理器MFT。是否有更独立于系统的加载方式

以下哪一个结论是正确的?是否可以在Windows 7上加载视频处理器MFT?如果是,如何

即使视频处理器MFT的旧文档中没有提到可用性限制,也可以根据相关内容进行假设:

要求

支持的最低客户端:Windows 8 Release Preview

支持的最低服务器:Windows server 2012

针对早期版本Windows的应用程序可能会使用其他DSP,如颜色控制变换DSP和颜色转换器DSP。不过这些不是GPU加速的。

视频处理器MFT的优点是它支持使用Microsoft Direct3D 11的GPU加速视频处理。

(这是对@SimonMourier非常有用的评论的扩展,对未来的读者来说,因为这对我来说都是新的。(

我认为CLSID_VideoProcessorMFT的可用性如下:

  • 对于>=Windows 8.1上的"Windows桌面应用程序">
  • 对于>=Windows 10上的"Windows应用商店">
  • 对于>=Windows 10上的"Windows Phone应用程序">

头文件mfidl.h记录了Windows版本中引入的特定COM类。按照CLSID_VideoProcessorMFT的定义,我发现:

#if (WINVER >= _WIN32_WINNT_WINTHRESHOLD) 
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
// ...
EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) */
#endif // (WINVER >= _WIN32_WINNT_WINTHRESHOLD) 
// ...
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#if (WINVER >= _WIN32_WINNT_WINBLUE) 
#if (WINVER < _WIN32_WINNT_WINTHRESHOLD) 
EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);
#endif // (WINVER < _WIN32_WINNT_WINTHRESHOLD) 
#endif // (WINVER >= _WIN32_WINNT_WINBLUE) 
// ...
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */

通过遵循并解码所有这些宏,我得到了上面的可用性列表。

相关内容

最新更新