windows下ffmpeg使用dxva2加速硬件解码

问题:

近期有解码H265格式的1080P@60压缩视频需求,使用之前的ffmpeg软解方案发现解不过来了,超极本解码一帧耗时20ms左右,所以想研究下硬解方案。

解决方案:

1、首先想到的是ffmpeg的硬解方案,一直对ffmpeg的硬解有所了解但是因为之前软解满足需求,没有多大动力去研究,这次遇到瓶颈简单查了下,资源很多,ffmpeg在examples\hw_decoder.c就提供很好的示例程序,网上的资料大多基于这个demo的。

2、其他还有英伟达的cuda方案,百度,谷歌出来有人做,做的还不错,据说能达到700帧,但是cuda依赖太多,技术难度较大,等到以后做2K,4K的265解码时再研究。

最后解决方案确定为使用ffmpeg自带硬解方案,简单,有现成的官方demo,参考资料也比较多。

实施:

代码编写比较简单,参考hw_decoder.c自己稍作修改就能改成接受实时流解码的方式,不过其中遇到一些问题,在此记录:

1、经测试我的笔记本和台式机都只支持4种方式解码:cuda、qsv、d3d11、dxva2;

     测试发现qsv不能使用,检测支持qsv解码器但是解码失败;

     cuda解码很快但是因为解码后的yuv需要从GPU拷贝到CPU(也可以不用拷贝,可以直接用GPU做渲染,不过没研究明白),这拷贝耗时达到了15~20ms,相比软解没啥提升,论坛上有人说最新的ffmpeg解决了这个问题,没有验证,暂时放弃;

     d3d这种方式解码加拷贝耗时相比软解有所提升,已经可以满足1080p60 265解码延时需求了,试图通过GPU解码不拷贝到CPU而是在GPU里直接渲染,感觉有点复杂,而且原有的显示方式是将cpu的yuv数据通过openGL渲染,改动有点费力。

    dxva2方式效率和拷贝速度相比d3d这种方式进一步提升,测试在低压版的超极本上解码加拷贝耗时在10ms以内,基本满足需求,我查看了potplayer的硬解方式,发现他硬解也是用dxva2,这种方式对硬件要求小,最终选定这个方案。

需要注意的是(硬解码出来的YUV格式并不固定,做渲染时具体处理或者通过ffmpeg将解码出来的AVFrame转换为YUV420p格式的AVFrame);

size = av_image_get_buffer_size(tmp_frame->format, tmp_frame->width,
                                        tmp_frame->height, 1);
        buffer = av_malloc(size);
        if (!buffer) {
            fprintf(stderr, "Can not alloc buffer\n");
            ret = AVERROR(ENOMEM);
            goto fail;
        }
ret = av_image_copy_to_buffer(buffer, size,
        (const uint8_t * const *)tmp_frame->data,
        (const int *)tmp_frame->linesize, tmp_frame->format,
        tmp_frame->width, tmp_frame->height, 1);

总结:

官方demo就是最好的demo,一开始没想到从ffmpeg源码中找示例,百度了不少,各家有各家修改的理由,最后发现还是官方demo最简洁,干净,把官方demo解文件修改成解实时流很轻松。

等有时间研究研究在GPU里解码直接渲染的方式,感觉对以后2K,4K高帧解码会有奇效。

还需要做下硬解软解适配,有的客户电脑比较老可能不支持硬解,还需要适配下。

代码下载地址:ffmpeg+dxva2硬解-编解码文档类资源-CSDN下载

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
FFmpeg是一种开源的多媒体处理工具,其中包含了dxva2解码功能。DXVA2是DirectX Video Acceleration 2的缩写,它是一种能够充分利用显卡硬件加速的视频解码技术。 使用FFmpeg进行dxva2解码时,可以获得以下几个优势: 1. 提高解码效率:dxva2解码能够使用显卡的硬件加速能力,从而大大提高视频解码的效率。相较于软解码,在相同的硬件条件下,dxva2解码可以更快地完成对视频的解码工作。 2. 减轻CPU负担:由于dxva2解码利用显卡进行解码,可以减轻CPU的负担,从而为其他任务提供更多的计算资源。这对于同时进行多任务处理的用户来说,尤其是一些对计算性能要求较高的场景,是非常有益的。 3. 优化视频播放体验:dxva2解码可以提供更平滑和流畅的视频播放体验。它能够更好地处理高分辨率、高比特率的视频文件,避免视频卡顿或者出现掉帧的情况。 然而,dxva2解码也存在一些限制和要求: 1. 硬件支持要求:要使用dxva2解码功能,需要具备支持DXVA2的显卡硬件。不同显卡型号和厂商支持的dxva2版本可能会有所不同,所以在使用前需要确认自己的显卡是否支持dxva2解码。 2. FFmpeg版本要求:为了能够使用dxva2解码功能,需要使用支持dxva2FFmpeg版本。更新的FFmpeg版本通常会修复一些bug并加入新的功能,所以建议使用最新版本的FFmpeg。 总结来说,通过FFmpegdxva2解码功能,我们可以提高解码效率、减轻CPU负担,并获得更好的视频播放体验。需要注意的是,确保硬件和软件环境支持dxva2解码,并及时更新FFmpeg版本可以保证最佳的使用效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值