【问题标题】:Obtaining decoder MFT for H.264 video获取 H.264 视频的解码器 MFT
【发布时间】:2022-01-10 23:54:20
【问题描述】:

我正在尝试从媒体基金会获得硬件解码器。我确定我的 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;
}

【问题讨论】:

    标签: c++ winapi video h.264 ms-media-foundation


    【解决方案1】:

    可能没有用于硬件解码的专用解码器 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。

    【讨论】:

    • 能够获取解码器,只需禁用删除 pAttributes 参数。谢谢你。我现在编辑了我的原始帖子以包含正确的代码
    • 澄清一下 - 这个 MFT 不是异步的,对吗?
    • 是的,是MFT_ENUM_FLAG_SYNCMFT
    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多