如何使用FFMPEG使用DXVA2来解码并获取框架



我搜索了一个简单的示例,介绍了如何使用Windows中的FFMPEG用硬件加速来解码H264流,但我找不到任何。我知道我应该使用FFMPEG使用DXVA2来加速。

i可以在CPU上使用FFMPEG解码H264,然后将NV12格式转换为RGBA,并将帧保存为BMP文件,这要归功于POST。

我遵循以下帖子中提供的内容,以获得有关DXVA2的帮助:Post

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

i解码并检索帧如下:

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 successfullyn");
        result = true;
    }
}

并将输出框架馈送到:

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

我得到此错误:

[SWSCALER @ 030C5C20] BAD SRC IMAGE POINTERS

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

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

解决问题。

这是由于像素格式类型不当。当创建SWS_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
    );

此外,请注意未检索的输出帧如下:

av_frame_unref(pFrameYuv);

否则您有内存泄漏。

plus,如POST所述,dxva2_retrieve_data_call效率低下。您应该寻找另一种从GPU获取数据的方法。

相关内容

  • 没有找到相关文章

最新更新