ffmpeg利用GPU来进行转码工作,支持NVIDIA现代化显卡。

 xiezixing @ 2019-05-02 17:23:08

ffmpeg利用GPU来转码其实是非常简单的,如果有人有需要,我可以写一个简单的FFMPEG转码源码出来。话不多说,我们来看看如何搞定ffmpeg利用GPU转码。

GPU转码说明

优势: 转码的速度比较快,比如32核和一块gpu,gpu加速确实比CPU转码要快4倍左右。
劣势: ffmpeg官方文档说明,GPU等硬件加速转码的效果一定是比libx264等软件转码的效果要垃圾,但是如果是追求速度的话可以使用GPU转码。一块GPU只能开一个FFMPEG进程,无法有效并发使用多张GPU显卡。

阿里云,腾讯云等常见云服务商的做法: 这些都是利用FFGA加速卡,进行CPU的指令优化来达到ffmpeg的加速转码,ffga比CPU更便宜,但是速度可以提高10多倍,国内有厂家专门设计和制作针对ffmpeg加速的FFGA加速卡。外面都在传的GPU转码,基本上没有云服务商会用GPU来加速FFMPEG转码,理由如上。

第一步、查看支持的gpu目录

不是所有的GPU都支持进行ffmpeg的加速转码,支持的目录如下:
支持FFMPEG的GPU

第二步、安装FFMPEG

如果想要支持GPU加速转码,则必须使用编码方式进行ffmpeg的安装。

编译安装的过程,可以参考:https://ffmpeg.moejj.com/guide/related.html#centos%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85ffmpeg

将库安装完毕之后,请不要先make和make install操作。

第三步、从NVIDIA 网站下载并安装兼容的驱动程序

链接:http://www.nvidia.com/drivers

第四步、下载并安装CUDA Toolkit CUDA工具包

链接:https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork
我这里选择的是UBUNTU16.04的安装方法,大家可以根据自己的服务器选择对应的安装方法。

第五步、使用以下configure命令进行编译安装ffmpeg

cd ffmpeg_source
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
  --prefix="$HOME/ffmpeg_build" \
  --pkg-config-flags="--static" \
  --extra-cflags=-I/usr/local/cuda/include \
  --extra-ldflags=-L/usr/local/cuda/lib64 \
  --extra-libs=-lpthread \
  --extra-libs=-lm \
  --bindir="$HOME/bin" \
  --enable-gpl \
  --enable-libfdk_aac \
  --enable-libfreetype \
  --enable-libmp3lame \
  --enable-libopus \
  --enable-libvorbis \
  --enable-libtheora \
  --enable-libvpx \
  --enable-libx264 \
  --enable-libx265 \
  --enable-nonfree \
  --enable-libass \
  --enable-cuda \
  --enable-cuvid \
  --enable-nvenc \
  --enable-nonfree \
  --enable-libnpp
make
make install

第六步、查看ffmpeg是否支持硬件加速选项

ffmpeg -hwaccels
Hardware acceleration methods:
cuvid

如果现实了CUVID就是正常的。

第七步、使用GPU进行视频转码

ffmpeg -y -hwaccel cuvid -c:v h264_cuvid -vsync 0 -i <input.mp4> -vf scale_npp=1920:1072
-vcodec h264_nvenc <output0.264> -vf scale_npp=1280:720 -vcodec h264_nvenc <output1.264>

上面这个命令行输出两种分辨率的视频,一个分辨率为19201072,一个分辨率是1280720.

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -c:v h264_nvenc <output.mp4>

转码单个分辨率成H264格式。

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i <input.mp4> -vf scale_npp=1280:720 -vcodec h264_nvenc <output0.mp4> -vf scale_npp 640:480 -vcodec h264_nvenc <output1.mp4>

上面的命令行是将一个文件转码成多个分辨率的视频。

总结

总体来说,利用GPU进行FFMPEG加速转码其实并不是什么新的技术,为什么没有流行是有原因的,利用GPU转码也是非常的简单,有兴趣的朋友可以自己试试。

最新回复:

xiezixing @ 2 个月前:

@wlrwx:
测试了下2000码率以下的视频使用CPU转码效果更好,但是如果2000码率以上,特别是到2500,2500以上的视频使用GPU转码效果更好,压缩率高,文件小,清晰度更好。不过前提是得有钱买卡烧,哈哈。

哦 感谢提醒

w
 wlrwx @ 2019-05-14 10:53:53

测试了下2000码率以下的视频使用CPU转码效果更好,但是如果2000码率以上,特别是到2500,2500以上的视频使用GPU转码效果更好,压缩率高,文件小,清晰度更好。不过前提是得有钱买卡烧,哈哈。

回复
 xiezixing @ 2019-05-14 21:00:41

@wlrwx:
测试了下2000码率以下的视频使用CPU转码效果更好,但是如果2000码率以上,特别是到2500,2500以上的视频使用GPU转码效果更好,压缩率高,文件小,清晰度更好。不过前提是得有钱买卡烧,哈哈。

哦 感谢提醒

回复