不动源码,让FFmpeg命令行执行时间缩短400%

December 09, 2023
测试
测试
测试
测试
5 分钟阅读

作者: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倍的速度,而且文件大小也小一点。

post11image1.png
post11image1.png

事实上,如果你投入时间和精力来调查nVidia GPU选项,你可以有更快的速度,但它仍然是伟大的速度,没有太多的努力和成本,不是吗?😄

如果你觉得这篇文章有用,不要犹豫,留下任何评论或点赞,谢谢你!

注:特别感谢技术指导dazhao(赵达)对本文翻译的审阅指正

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多