繁体   English   中英

获取 H.264 视频的解码器 MFT

[英]Obtaining decoder MFT for H.264 video

我正在尝试从媒体基金会获得硬件解码器。 我确定我的 gpu 支持 nvdec 硬件解码。 我在 github 上找到了一个例子,它得到了编码器,nvenc 没有任何问题。 但是当我将参数切换到解码器时,我要么得到一个糟糕的 hresult 要么崩溃。 我什至尝试通过更改硬件标志来获得软件解码器,但结果仍然很糟糕。 有人知道出了什么问题吗? 我想不出还有什么可以让我尝试或改变的

HRESULT get_decoder(CComPtr<IMFTransform>& out_transform, CComPtr<IMFActivate>& out_activate,
    CComPtr<IMFAttributes>& out_attributes)
{
    HRESULT hr = S_OK;

    // Find the decoder
    CComHeapPtr<IMFActivate*> activate_raw;
    uint32_t activateCount = 0;

    // Input & output types
    const MFT_REGISTER_TYPE_INFO in_info = { MFMediaType_Video, MFVideoFormat_H264 };
    const MFT_REGISTER_TYPE_INFO out_info = { MFMediaType_Video, MFVideoFormat_NV12 };

    // Get decoders matching the specified attributes
    if (FAILED(hr = MFTEnum2(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_SORTANDFILTER, &in_info, &out_info,
        nullptr, &activate_raw, &activateCount)))
        return hr;

    // Choose the first returned decoder
    out_activate = activate_raw[0];

    // Memory management
    for (int i = 1; i < activateCount; i++)
        activate_raw[i]->Release();

    // Activate
    if (FAILED(hr = out_activate->ActivateObject(IID_PPV_ARGS(&out_transform))))
        return hr;

    // Get attributes
    if (FAILED(hr = out_transform->GetAttributes(&out_attributes)))
        return hr;

    std::cout << "- get_decoder() Found " << activateCount << " decoders" << std::endl;

    return hr;
}

可能没有用于硬件解码的专用解码器 MFT(即使某些供应商提供这些)。 与编码相比,硬件视频解码可通过 DXVA 2 API 获得,而Microsoft H264 Video Decoder MFT又涵盖了这一点。

该库存 MFT 能够使用硬件进行解码,并且还与启用 D3D9 和 D3D11 的管道兼容。

Microsoft H264 视频解码器 MFT

6个属性:

  • MFT_TRANSFORM_CLSID_Attribute:{62CE7E72-4C71-4D20-B15D-452831A87D9D}(类型 VT_CLSID,CLSID_CMSH264DecoderMFT)
  • MF_TRANSFORM_FLAGS_Attribute:MFT_ENUM_FLAG_SYNCMFT
  • MFT_INPUT_TYPES_Attributes:MFVideoFormat_H264、MFVideoFormat_H264_ES
  • MFT_OUTPUT_TYPES_Attributes:MFVideoFormat_NV12、MFVideoFormat_YV12、MFVideoFormat_IYUV、MFVideoFormat_I420、MFVideoFormat_YUY2

属性

  • MF_SA_D3D_AWARE:1(类型 VT_UI4)
  • MF_SA_D3D11_AWARE:1(类型 VT_UI4)
  • CODECAPI_AVDecVideoThumbnailGenerationMode:0(类型 VT_UI4)
  • CODECAPI_AVDecVideoMaxCodedWidth:7680(类型 VT_UI4)
  • CODECAPI_AVDecVideoMaxCodedHeight:4320(类型 VT_UI4)
  • CODECAPI_AVDecNumWorkerThreads:4294967295(类型 VT_UI4,-1)
  • CODECAPI_AVDecVideoAcceleration_H264:1(类型 VT_UI4)...

来自MSDN

CODECAPI_AVDecVideoAcceleration_H264启用或禁用硬件加速。

...

最大分辨率 4096 × 2304 像素 DXVA 加速的最大保证分辨率为 1920 × 1088 像素; 在更高分辨率下,如果底层硬件支持,则使用 DXVA 进行解码,否则使用软件进行解码。

...

DXVA 解码器支持 DXVA 版本 2,但不支持 DXVA 版本 1。DXVA 解码仅支持与 Main 兼容的 Baseline、Main 和 High profile 比特流。 (主要兼容的基线比特流定义为 profile_idc=66 和 constrained_set1_flag=1。)

要使用硬件加速进行解码,只需使用 Microsoft H264 Video Decoder MFT。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM