作者:Jerome Wu
原文链接:Speedup FFmpeg without compiling from source code
译者:Yodonicc
FFmpeg是一个很好的多媒体处理工具,默认情况下,它使用多线程的CPU来完成任务,这给你的电脑带来了很高的负荷,在大多数时候是很慢的。
如果你在谷歌上搜索如何提高FFmpeg的速度,你可能会发现关于使用-preset
的讨论,它降低了压缩率以获得更高的速度(文件大小和速度之间的权衡),另一个性感的方法是利用nVidia GPU(nvenc,nvdec和cuvid),但这并不容易:
- 你没有一个兼容的nVidia GPU卡
- 你需要安装nVidia GPU驱动和CUDA(在Linux环境下很痛苦)
- 如果你找不到可以使用的版本,你需要从源头上编译FFmpeg。
根据我自己的经验,我花了很多小时研究如何安装和编译FFmpeg,但最后还是失败了,因为我的GPU无法支持大部分的功能,这让我很难过。
那么,有没有其他方法可以让FFmpeg更快?有的,而且你可以在几秒钟内用VAAPI
做到这一点。让我们做个实验,看看有什么不同。
基准线:缩放一个视频,不加任何额外选项
想象一下,你正在创建一个服务,提供不同质量的视频流(720p、1080p等),所以你需要将上传的视频缩减到不同的分辨率。
让我们从h264info下载一个样本视频,并在没有任何选项的情况下进行缩放:
$ ffmpeg -i gravity.mp4 \
-c:v libx264 \
-s 1024x428 \
-b:v 1M \
out.mp4
它需要大约42秒(速度=3.5倍),文件大小为21MB。(原始大小为355 MB)
用-preset来加速更大的文件大小
点击这里了解更多关于preset的细节
使用preset,你可以很容易地以更大的文件大小来加速FFmpeg,当你的硬盘有足够的空间时,这是可以接受的。
$ ffmpeg -i gravity.mp4 \
-c:v libx264 \
-preset ultrafast \
-s 1024x428 \
-b:v 1M \
out.mp4
这需要大约22秒(速度=6倍),文件大小为20MB。(有趣的是,它比-preset default
😎要小)。
使用VAAPI来加快集成/英特尔GPU卡的速度
视频加速API(VAAPI)在FFmpeg中并不是一个秘密,但很难注意到它是如何轻松帮助你加速FFmpeg的。使用VAAPI的好处是:
- 集成GPU卡很便宜(而且你现在已经有一个了)
- 你只需要安装
i965-va-driver
就可以了。 - 你不需要编译FFmpeg,因为这个标志是默认启用的。
要在Ubuntu中使用VAAPI,首先你需要安装驱动程序并使用vainfo
命令检查状态。
$ sudo apt-get install i965-va-driver
$ vainfo
libva info: VA-API version 1.1.0
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_1_1
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.1 (libva 2.1.0)
vainfo: Driver version: Intel i965 driver for Intel(R) Ivybridge Mobile - 2.1.0
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264StereoHigh : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
VAProfileJPEGBaseline : VAEntrypointVLD
如果你看到类似上述的输出,说明你的英特尔GPU卡支持VAAPI,那么你可以使用下面的命令来执行scale:
$ ffmpeg -hwaccel vaapi \
-hwaccel_device /dev/dri/renderD129 \
-hwaccel_output_format vaapi \
-i gravity.mp4 \
-vf "scale_vaapi=w=1024:h=428" \
-c:v h264_vaapi \
-b:v 1M \
out.mp4
这需要大约10秒(速度=14.3倍),文件大小为19MB。
把它们放在一个图表中,使用VAAPI可以得到比本地快4倍的速度,而且文件大小也小一点。
事实上,如果你投入时间和精力来调查nVidia GPU选项,你可以有更快的速度,但它仍然是伟大的速度,没有太多的努力和成本,不是吗?😄
如果你觉得这篇文章有用,不要犹豫,留下任何评论或点赞,谢谢你!
注:特别感谢技术指导dazhao(赵达)对本文翻译的审阅指正。