加速FFmpeg转码
Posted bing_goo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了加速FFmpeg转码相关的知识,希望对你有一定的参考价值。
FFmpeg是多媒体处理的出色工具,默认情况下,它使用具有多线程的CPU来执行任务,这会给您的服务器带来很高的负载,并且在大多数情况下会很慢,例如使用FFmpeg将RTSP流转码成HLS流或FLV流输出时,服务器同时开启50路转码任务时,服务器资源会耗尽,输出的视频流会花屏、卡顿。
如何提高FFmpeg的速度:
方法一:使用-preset降低压缩率以获得更高速度(文件大小和速度之间进行权衡);
方法二:购买硬件,移植代码,使用GPU(nvenc,nvdec和cuvid)实现硬件解码,但这并不容易。
编码器预设参数设置preset
这个参数主要调节编码速度和质量的平衡,有:
ultrafast:最快的编码方式
superfast:超级快速的编码方式
veryfast:非常快速的编码方式
faster:稍微快速的编码方式
fast:快速的编码方式
medium:折中的编码方式
slow:慢的编码方式
slower:更慢的编码方式
veryslow:非常慢的编码方式
placebo:最慢的编码方式
默认的编码速度是medium模式
medium
ultrafast
FFmpeg使用显卡进行转码硬件加速的记录,以及和软压的比较
参考技术A 操作系统: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是一个对于我来说比较好的选择。
以上是关于加速FFmpeg转码的主要内容,如果未能解决你的问题,请参考以下文章