文章目录
1. 按
由于GPU虽然速度快,但是质量不高,处理后的视频体积较大。而我主要是优化视频体积和质量的,因此在实际的场景中我几乎没有用过GPU进行加速,只是在测试时用了下。
2. ffmpeg下载
官网下载页:https://ffmpeg.org/download.html
建议下载编译好的版本,否则可能还需要自己编译,下载页面:https://ffmpeg.zeranoe.com/builds/
我一般比较喜欢下载最新版的(以日期命名的),当然还有个稳定版(以版本号命名的)的。
3. 英伟达(NVIDIA)GPU
英伟达的GPU需要先下载驱动(CUDA)
3.1. CUDA下载
CUDA是一个驱动程序,可以让GPU进行相关运算,因为我们开发应用程序一般不直接操控GPU,而是通过驱动来操作。
https://developer.nvidia.com/cuda-downloads
这里我选择版本的如下图:
当然也可以点击如下链接,直接转到我下载时的设置。
https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal
下载完了记得安装,那就不介绍了吧,毕竟都是开发软件的。
3.2. 命令
3.2.1. 查询命令
查询所下载的ffmpeg是否支持cuda,如果不支持(我下载的是支持的),那重新下载一下或者自行编译。
ffmpeg -hwaccels
3.2.2. 测试命令
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 0.mp4 -c:v h264_nvenc -y 00.mp4
将当前目录下的0.mp4转成00.mp4
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i 0.mp4 -c:v h264_nvenc -r 15 -b 500k -y 00.mp4
将当前目录下的0.mp4转成00.mp4,并指定输出帧率为15(-r 15),比特率为500k(-b 500k)
ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
-hwaccel cuvid:指定使用cuvid硬件加速
-c:v h264_cuvid:使用h264_cuvid进行视频解码
-c:v h264_nvenc:使用h264_nvenc进行视频编码
-vf scale_npp=1280:-1:指定输出视频的宽高,注意,这里和软解码时使用的-vf scale=x:x不一样
3.2.3. 多颗显卡命令
GPU转码效率测试
在配有两颗Intel-E5-2630v3 CPU和两块Nvidia Tesla M4显卡的服务器上,进行h264视频转码测试,成绩如下:
GPU转码平均耗时:8s
CPU转码平均耗时:25s
并行转码时,CPU软转的效率有所提高,3个转码任务并行时32颗核心全被占满,此时的成绩
GPU转码平均耗时:8s
CPU转码平均耗时:18s
不难看出,并行时GPU的转码速度并没有提高,可见一颗GPU同时只能执行一个转码任务。那么,如果服务器上插有多块显卡,ffmpeg是否会使用多颗GPU进行并行转码呢?
很遗憾,答案是否。
ffmpeg并不具备自动向不同GPU分配转码任务的能力,但经过一番调查后,发现可以通过-hwaccel_device参数指定转码任务使用的GPU!
向不同GPU提交转码任务
显卡0
ffmpeg -hwaccel cuvid -hwaccel_device 0 -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
显卡1
ffmpeg -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i <input> -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y <output>
说明:
-hwaccel_device N:指定某颗GPU执行转码任务,N为数字
Linux下稍微麻烦一点儿,具体可参考:https://www.jianshu.com/p/59da3d350488
4. AMD GPU
AMD的GPU不需要额外下载东西,只要把ffmpeg编译好就能用。Windows版的ffmpeg官网提供了编译好的版本,因此Windows用户无需过多操心这个了,Linux如有需要,请参考:
4.1. 命令
将a.mp4转成b.mp4
ffmpeg -i .\a.mp4 -c:v h264_amf .\b.mp4