2

我正在尝试编写一个使用 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 扩展之前我没有收到此错误。

更新:

我在我拥有的另一台计算机上运行我的程序,它运行良好。“进程没有包标识”也出现在那里,但似乎不是问题。

4

0 回答 0