前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >不动源码,让FFmpeg命令行执行时间缩短400%

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

原创
作者头像
智影Yodonicc
发布2022-04-26 01:10:48
6.9K2
发布2022-04-26 01:10:48
举报
文章被收录于专栏:智影Yodonicc智影Yodonicc

作者: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(赵达)对本文翻译的审阅指正

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基准线:缩放一个视频,不加任何额外选项
  • 用-preset来加速更大的文件大小
  • 使用VAAPI来加快集成/英特尔GPU卡的速度
相关产品与服务
多媒体处理
多媒体处理(Multimedia Processing,MMP)是数据万象推出的音视频处理服务,集成音视频转码、极速高清、精彩集锦、超分辨率、数字水印等能力,满足传媒、文旅、电商等各行业多媒体处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档