ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战

ffmpeg + cuda(cuvid) 硬解码+像素格式转换(cpu主导)实战,第1张

cuvid 与 VDPAU 是平级的东西,不能拿来直接使用,使用成本太大

note:

note

Note: For Video Codec SDK 7.0 and later, NVCUVID has been renamed to NVDECODE API.

这是我第一次使用的方式,模仿 cpu 上软解码(获取视频帧,并存储为bmp格式,经验原则,这种方式最容易想到)

运行结果:

失败,bad src img pointers

运行结果如下图所示:

问题原因:

gpu 不支持 sws_scale + AV_PIX_FMT_CUDA->AV_PIX_FMT_BGR24 的直接像素转换方式,那么 能否直接在gpu中直接转化 AV_PIX_FMT_CUDA 为 AV_PIX_FMT_BGR24呢?

如果可以直接实现,性能会有很大提升,因为减少了device->host 的数据传输,且gpu多核心并行处理,肯定比cpu处理性能要强悍。

运行结果:

失败,像素没对齐,只有亮度

运行结果如下图所示:

![预先设置内存中frame目标像素格式为 AV_PIX_FMT_BGR24]

问题原因:

如下图所示:

所以gdb了下源码,发现src->frame->format 转换为 dst->frame->format 的受限范围很小,然后找出了 av_hwframe_transfer_get_formats 支持的formats,

调试过程如下所示:

gdb -tui hw_decode_cuvid (-tui 支持查看源码)

在调用 av_hwframe_transfer_data() 函数处打上断点,且设置程序运行所需参数

run 程序,step 进入函数调用栈

n 单步运行,函数调用至 transfer_data_alloc()

发现 av_hwframe_transfer_get_formats()函数

更改 dst->format 的值为<0的值,并打印支持的像素转换列表

可以看到只支持 gpu 硬件像素编码格式->AV_PIX_FMT_NV12 的转换

运行结果:

成功,如下图所示:

*** 作系统:Windows 10

FFmpeg版本:20171204

显卡:GTX 965M

最近是有比较多的压制需求,使用libx265软压的速度实在是慢的受不了,所以还是希望能用显卡硬压起码速度快一点。之前有人跟我提过硬压质量似乎不及软压,但是决定还是试一试。在ffmpeg官网找到硬压的 相关信息 。

由于我用的是windows,所以驱动基本没有特别配置。而且windows版的ffmpeg也是参数配置好的,所以这方面没有考虑太多。linux平台可能需要配置一下参数啥的。

压制分为两步,先是对视频解码再编码。ffmpeg在两步都提供了硬件加速方案。

在官网给出的例子是基于h264的,h265的硬件参数啥的可以用:

ffmpeg -codecs | sls cuvid (备注:sls是powershell的命令,类似于linux下的grep命令)

可以看到这条:

DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_cuvid ) (encoders: libx265 nvenc_hevc hevc_nvenc hevc_qsv )

解码器提供了 hevc , hevc_qsv , hevc_cuvid 编码器提供了 libx265 , nvenc_hevc , hevc_nvenc , hevc_qsv ,但是这个 nvenc_hevc 其实已经作废了,你用它的话他会提示你自动给你转到 hevc_nvenc 。

解码器的这三个用法我是不太懂有啥区别,也没去做太多研究,因为在实践中使用硬解的话是没办法同时硬压字幕的,会报错,况且硬解对于整体压制速度并没有太大提升,所以就抛弃硬解了。

编码器的部分, libx265 就是软压, hevc_qsv 似乎是英特尔的集显硬压,具体看 这里 。那么留给n卡的只有 hevc_nvenc 可以用了。

使用这条命令来查看该方法的参数:

ffmpeg -h encoder=hevc_nvenc

可以得到可用参数,我们这里探究的是-cq参数,给出的描述是:

-cq <float>E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)

我感兴趣的原因是它和libx265,也就是软压的-crf参数很类似。所以接下来都是在其他参数不考虑的情况下对不同cq的对比。

我用的是谍影重重5的预告片压制测试,原视频数据如下:

在使用命令

ffmpeg -i original.mov -c:v hevc_nvenc -cq X cqx.mp4

进行测试后。结果如下:

Libx265 (软压)

-cq 0(默认)

-cq 1

-cq 10

-cq 20

-cq 30

-cq 35

-cq 38

-cq 41

-cq 51

对比视频在 这里 。

可以看到cq在1到30的变化并不大,在41以上画面基本上是没办法看了。在和libx265的默认软压对比后,-cq值落在35到40之间是比较好的选择。

在后续的实际应用中,我在压制画面动作较少的视频,如交响乐视频的情况下,-cq 37是一个对于我来说比较好的选择。

WIN7系统下---InternetExplorer9浏览器,打开“Internet选项〉高级”的时候,却找不到“加速的图形-使用软件呈现而不使用GPU呈现”这个选项呢?(此处理方法只针对WIN7下InternetExplorer9浏览器,已正确安装显示卡驱动的机型)处理方法:方法一:重装IE9重装是个相对比较繁复但彻底的方法,。如果觉得麻烦,也可以用直接修改注册表的方法:从正常工作的计算机上复制注册表文件来替换掉问题计算机的相关项目。方法二:修改注册表一、复制文件:在正常安装IE9的计算机上:在键盘上按一下组合键“Win+R”调出运行命令框,键入regedit.exe,回车,打开注册表编辑器。(若d出用户账户控制窗口,请允许以继续)找到注册表项:HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternetExplorerAdvancedOptionsACCELERATED_GRAPHICS选中,右击鼠标,单击“导出”,将其保存为.reg格式文件。二、导入文件:在IE9出现问题的计算机上:由于注册表修改不当会比较麻烦,最好先作一下备份。回到自己的计算机,如上所述,找到HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternetExplorerAdvancedOptionsACCELERATED_GRAPHICS先将其导出保存。然后,右击鼠标,选择“删除”。找到上面步骤中从正常机器上复制过来的文件,双击导入。添加注册表成功之后,需要重启计算机。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11430612.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存