视频转码时如果遇见视频比较大、时长很长的时候,转码压制需要等待很久且及占用cpu,所以就在想有没有什么办法可以加速转码进度呢,故本篇文章记录FFmpeg如何调用显卡对转换编码格式或者压制进行加速。
软硬编解码的区分:
软编码:使用CPU进行编码 硬编码:使用非CPU进行编码,如显卡GPU、专用的DSP、FPGA、ASIC芯片等
软硬编解码的区别:
软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低,低码率下质量通常比硬编码要好一点。 硬编码:性能高,低码率下通常质量低于软编码器,但部分产品在GPU硬件平台移植了优秀的软编码算法(如X264)的,质量基本等同于软编码。
简单来说硬解码就是内存- codec电路-内存/显示的过程所以速度会比软件编解码快
此次教程基础环境配置:
FFmpeg BUILDS 4.4.1
FFmpeg Builds
GeForce GTX 1060(NVIDIA)
显卡支持列表
windows 10
安装FFmpeg
前面已经发文讲过FFmpeg下载安装,在此不再赘述,相关链接:FFmpeg下载和环境变量配置教程
安装CUDA驱动
CUDA是一个驱动程序,可以让GPU进行相关运算,因为我们开发应用程序一般不直接操控GPU,而是通过驱动来操作。
首先确定自己的电脑是否支持CUDA:
CUDA驱动下载:
选择系统类型下载,按照提示默认安装即可。
ffmpeg支持的硬件
硬件加速方式
通过命令ffmpeg -hwaccels可以查询系统支持的硬件加速器。
ffmpeg -hwaccels ---------------------------------------------- cuda dxva2 qsv d3d11va opencl vulkan
PS:以上输出代表系统所支持的硬件加速方式,后续会用到
硬编码后缀解释
qsv:intel显卡的快速视频同步技术(quick sync video)
nvenc:nvidia显卡的硬件视频编码器(nvidia hardware video encoder)
cuvid:nvdec的旧称,只有解码端。
cuda:同上
amf:amd显卡的amf硬件编码器(amd hardware encoder)
基本上所有的Intel电脑都支持qsv方式。
编解码器支持
ffmpeg -codecs
查询编码器
ffmpeg -codecs
后面可以跟sls命令查询所需的编码,例如:ffmpeg -codecs | sls nvenc
ffmpeg -codecs | sls nvenc --------------------------------------------------------------- DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10(decoders: h264 h264_qsv h264_cuvid)(encoders: libx264 libx264 libx264rgb h264_amf h264_nvenc h264_qsv) DEV.L. hevc H.265 / HEVC(High Efficiency Video Coding)(decoders: hevc hevc_qsv hevc_cuvid)(encoder s: libx265 hevc_amf hevc_nvenc hevc_qsv)
查询系统支持的编解码格式,需要用到ffmpeg -decoders和ffmpeg -encoders两个命令。
查询编解码器选项
查询编码器hevc_nvenc的选项
ffmpeg -h encoder=hevc_nvenc
查询解码器h264_qsv的详细信息
ffmpeg -h decoder=h264_qsv
ffmpeg -decoders
下面以h264作为测试
ffmpeg -decoders | sls h264 ------------------------------------------------------ VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 V….D h264_qsv H264 video(Intel Quick Sync Video acceleration)(codec h264) V….. h264_cuvid Nvidia CUVID H264 decoder(codec h264)
PS:
h264_qsv,h264_cuvid,h264:就是支持的解码方式
sls:作用相当于linux中的grep
h264_qsv:英特尔硬解码
h264_cuvid:英伟达硬解码
ffmpeg -encoders
同解码格式查询
ffmpeg -encoders | sls h264 -------------------------------------------------------- V….. libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10(codec h264) V….. libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10(codec h264) V….. libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB(codec h264) V….D h264_amf AMD AMF H.264 Encoder(codec h264) V….D h264_nvenc NVIDIA NVENC H.264 encoder(codec h264) V….. h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10(Intel Quick Sync Video acceleration)(codec h26)
sls:作用相当于linux中的grep
如以上有类似输出则证明是支持硬解码或者硬编码的。
硬件加速命令
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 2048k -s 1920x1080 output.mp4
常用命令参数解释
-hwaccel cuvid:使用cuvid进行硬件加速
-c:v h264_cuvid:使用h264_cuvid进行解码
-c:v h264_nvenc:使用h264_nvenc进行编码(nvidia硬件加速x265)
-b:v 2000k:位元率,值越大约清晰。
-s 1920x1080:分辨率
-b:v 3500K:视频平均位元率为3500K
-bufsize 6000K:缓存区大小6000K,建议设定为当前码率帧率5,也许这里的2pass是针对缓冲区的,缓存未来5s
-maxrate 5000K:最大码率为5000K,每帧的最高码率不超过这个数值
-preset slow:预设方案是slow,slow已经是最好的选项了
-pix_fmt p010le:输出的像素格式是p010le也就10bit,只有新的硬件支持,例如:970m不支持,1070可以支持
总结:
以上就是使用ffmpeg硬件加速转码的整体过程,如有疑问或者意见欢迎大家讨论。
还没有评论,来说两句吧...