我正在尝试编写一个使用 IMFTransform 解码 HEVC 视频的程序。我能够创建一个 IMFTransform 解码器,使用 MF_MT_MAJOR_TYPE=MFMediaType_Video 和 MF_MT_SUBTYPE=MFVideoFormat_HEVC 调用 SetInputType,但是当我使用 MFVideoFormat_NV12 调用 SetOutputType 时,我得到了 MF_E_ATTRIBUTENOTFOUND。
最终我决定尝试从 Microsft Store 安装“HEVC Video Extensions”,但现在我的代码在 IMFActivate::ActivateObject 处失败并返回错误 E_ACCESSDENIED。
// WindowsProject6.cpp : Defines the entry point for the application.
//
#include <iostream>
#include <initguid.h>
#include <mfapi.h>
#include <mftransform.h>
#include <combaseapi.h>
#include <d3d11.h>
#include <optional>
#include <Mferror.h>
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MFT_REGISTER_TYPE_INFO inputInfo{ MFMediaType_Video , MFVideoFormat_HEVC };
MFT_REGISTER_TYPE_INFO outputInfo{ MFMediaType_Video , MFVideoFormat_NV12 };
//CLSID* clsIds;
//unsigned int numClsIds = 255;
IMFActivate** activates;
unsigned int numActivates = 255;
CoInitialize(NULL);
//auto result2 = MFTEnum(MFT_CATEGORY_VIDEO_DECODER, 0, &inputInfo, nullptr, nullptr, &clsIds, &numClsIds);
auto result = MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SYNCMFT, &inputInfo, nullptr, &activates, &numActivates);
if (result != S_OK) {
std::cout << "MFTEnum failed" << std::endl;
std::terminate();
}
std::cout << numActivates << std::endl;
if (!numActivates) {
std::cout << "No HEVC decoders found" << std::endl;
std::terminate();
}
IMFTransform* decoder;
result = activates[0]->ActivateObject(IID_PPV_ARGS(&decoder));
if (result != S_OK) {
std::cout << "ActivateObject failed" << std::endl;
std::terminate();
}
}
我卸载了“HEVC Video Extensions”,但仍然收到拒绝访问错误。我仍然有一个名为“来自设备制造商的 HEVC 视频扩展”的东西,“应用程序和功能”说它是几周前安装的。在 Visual Studio 输出窗口中,我看到以下内容:
info:Windows::Services::Store::StoreContextFactory::GetDefault() invoked. (CV:JU3c8WzRMkqe8jy+.2) [Windows::Services::Store::StoreContextFactory::GetDefault]
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\OneCoreUAPCommonProxyStub.dll'.
info:StoreContextServer::Initialize: packageFullName = , productStoreId = , isLicensed = false, isAppContainer = false [Windows::Services::Store::Internal::StoreContextServer::Initialize]
info:Windows::Services::Store::StoreContext::AcquireStoreLicenseForOptionalPackageAsync invoked. (CV:JU3c8WzRMkqe8jy+.2.3) [Windows::Services::Store::StoreContext::AcquireStoreLicenseForOptionalPackageAsync]
ERROR: (0x80070057) [ClientProcessUtils::GetCallingAppPackageFamilyName]
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\usermgrcli.dll'.
ERROR: (0x80070057) [ClientProcessUtils::GetCallingAppPackageFamilyName]
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\AppContracts.dll'.
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\UserMgrProxy.dll'.
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\Windows.Shell.ServiceHostBuilder.dll'.
'WindowsProject5.exe' (Win32): Loaded 'C:\Windows\System32\OnDemandBrokerClient.dll'.
onecoreuap\base\appmodel\appcontracts\lib\odbexecutor.cpp(115)\AppContracts.dll!00007FFEA083664B: (caller: 00007FFEA07E4A35) ReturnHr(1) tid(3dbc) 80073D54 The process has no package identity.
CallContext:[\AppServiceBackgroundTask]
这似乎表明问题在于我不是在编写 UWP 应用程序,而是在制作 Win32 桌面程序。我的目标是最终扩展现有的 Win32 程序,因此 UWP 不是一个选项。此外,在安装 HEVC 扩展之前我没有收到此错误。
更新:
我在我拥有的另一台计算机上运行我的程序,它运行良好。“进程没有包标识”也出现在那里,但似乎不是问题。