【问题标题】:How to employ DXVA2 with ffmpeg to decode and get frame如何使用 DXVA2 和 ffmpeg 解码和获取帧
【发布时间】:2016-10-24 03:03:37
【问题描述】:

我已经搜索了一个关于如何在 Windows 中使用 ffmpeg 使用硬件加速解码 H264 流的简单示例,但我找不到任何示例。 我知道我应该使用 dxva2 和 ffmpeg 来进行硬件加速。

我可以在 CPU 上使用 ffmpeg 解码 H264,然后将 NV12 格式转换为 RGBA 并将帧保存为 bmp 文件,这要感谢 post 中提供的示例项目。

我已按照以下帖子中提供的内容获取有关 dxva2 的帮助:post

我相信我可以用 dxva2 成功解码;但是,当我想获取解码帧并将其转换为 RGBA 格式并将其保存为 bmp 文件时,我会收到有关源指针的错误。

我解码和检索帧如下:

int videoFrameBytes = avcodec_decode_video2(pCodecCtx_hwaccel, pFrameYuv, &got_picture_ptr, avpkt);

if (got_picture_ptr==1)
{
    if(dxva2_retrieve_data_call(pCodecCtx_hwaccel, pFrameYuv) == 0)
    {
        fprintf(stderr, "Got frame successfully\n");
        result = true;
    }
}

并将输出帧提供给:

sws_scale(pImgConvertCtx, pFrameYuv->data, pFrameYuv->linesize, 0, height, frame->data, frame->linesize);  

我收到此错误:

[swscaler @ 030c5c20] 错误的 src 图像指针

pFrameYuv->data 显然有问题,但我不知道是什么问题。

我们如何将使用 DXVA2 解码的 NV12 帧转换为使用 sws_scale 的 RGBA?

【问题讨论】:

    标签: c++ ffmpeg hardware-acceleration dxva swscale


    【解决方案1】:

    问题解决了。

    这是由于不正确的像素格式类型。 在创建 sws_context 时,我使用了 codec context 的像素格式,如下图所示:(这对于 SW 解码没问题)

    // initialize SWS context for software scaling
    sws_ctx = sws_getContext(pCodecCtx->width,
        pCodecCtx->height,
        pCodecCtx->pix_fmt,
        pCodecCtx->width,
        pCodecCtx->height,
        AV_PIX_FMT_RGB24,
        SWS_BILINEAR,
        NULL,
        NULL,
        NULL
        );
    

    并且 pCodecCtx->pix_fmt 是 AV_PIX_FMT_YUV420P 但解码的帧格式是 AV_PIX_FMT_NV12 和 DXVA2。设置正确格式后,我可以使用 sws_scale 将 NV12 帧转换为 RGB。

    正确的参数:

    // initialize SWS context for software scaling
    sws_ctx = sws_getContext(pCodecCtx->width,
        pCodecCtx->height,
        AV_PIX_FMT_NV12,
        pCodecCtx->width,
        pCodecCtx->height,
        AV_PIX_FMT_RGB24,
        SWS_BILINEAR,
        NULL,
        NULL,
        NULL
        );
    

    另外,注意 unref 输出检索帧如下:

    av_frame_unref(pFrameYuv);
    

    否则你有内存泄漏。

    另外,正如post 中所述,dxva2_retrieve_data_call 效率非常低。您应该寻找另一种从 GPU 获取数据的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多