我有以下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) */
通过遵循并解码所有这些宏,我得到了上面的可用性列表。