ffmpeg 是一款非常常用的视频编码解码工具,而且 ffmpeg是支持 NV 显卡硬件加速以及 Intel 核显的 QSV 加速。在 Window 下,使用 ffmpeg 的 qsv 加速还算不太复杂,但在 Ubuntu 下,需要安装一大串工具,而且还需要自己编译 ffmpeg。之前尝试过失败后, 就放弃了。
过去一直使用二手服务器来进行视频转码压缩,服务器 CPU 一般核心多,而且 SAS 硬盘便宜,一台几十核的服务器装好虚拟机,一起运行解码,就算没有硬件加速,速度也是勉强过得去。
然而,最近由于各种电脑硬件价格飞涨,过去一千几百的二手服务器都已经涨到天价,更不要提硬盘了。而旧的服务器性能越来越落后,耗电和噪声都非常烦人,所以又萌生出拿旧的电脑装上 linux 服务器系统,配合核显 qsv 加速来替代服务器进行编码转码工作。
在开始干之前,需要做好心理准备。因为我为了实现这个,已经重装多次系统了。
首先,关于如何在 Ubuntu 配置 Intel核显QSV 的中文资料,实在是少。知乎上有一个关于这个话题的文章写的非常详细,但是非常不幸的是我按照那篇文章的步骤,第一步编译 libva
就失败了。
而至于英文资料,大多都是复制或者引用 Intel 官方的 MediaSDK 的 Wiki 资料。最坑的是,官方的资料有很多地方没有讲清楚和不同介绍之间有矛盾。比较有用的一篇官方资料是《Build FFmpeg QSV》。安装配置的大致思路可以从这里找到。
我尝试了3个测试硬件环境,分别是一台 WIndow 的主机,以及两台 Ubuntu 的服务器。
Windows主机:
i5 4570+ z87 平台 (Window10)
Ubuntu服务器:
G4400 + h110 平台
J1900 准系统平台
以上服务器系统均为 Ubuntu 20.04
关于配置这个硬件加速环境,其实难的不是具体的安装过程,而是没有一个全局的安装配置思路介绍,所以结合我的踩坑经验,介绍一下整体的思路,可能未必理解正确,供参考。
首先,我们要使用 ffmpeg 的 qsv 硬件加速,主要有两大步骤:
安装好 Intel Media SDK
编译 ffmpeg
其中,安装 Intel Media SDK 又可以分为两步:
Intel Media Driver for VAAPI (也就是 LibVA 和 Media-Driver 的安装)
Intel Media SDK 的编译安装
比较幸运的是,在 Ubuntu 19.04 之后,Intel Media Driver for VAAPI 已经可以使用 apt 安装,这个解决了很多奇怪的问题。我们剩下的难点就只有 编译 Intel Media SDK 和 ffmpeg 了。
因为我的系统是 Ubuntu 20.04 ,所以可以直接使用 apt 安装,如果是 Ubuntu 19 之前的系统,估计要走编译的方法。
执行以下命令,即可完成安装:
sudo apt-get install libmfx1 libmfx-tools
sudo apt-get install libva-dev libmfx-dev intel-media-va-driver-non-free
sudo apt-get install vainfo
安装完成后,需要配置以下环境变量,可以在 .bashrc
或者 .zshrc
末尾添加:
export LIBVA_DRIVER_NAME=iHD
我们可以使用 vainfo
来查看是否安装成功:
sudo vainfo
>
error: XDG_RUNTIME_DIR not set in the environment.
error: can't connect to X server!
libva info: VA-API version 1.7.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_7
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.7 (libva 2.6.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 20.1.1 ()
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Simple : VAEntrypointEncSlice
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointFEI
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointFEI
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointFEI
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointFEI
首先先安装好依赖:
sudo apt-get install git cmake pkg-config
sudo apt-get install meson libdrm-dev automake libtool
接下来下载 MSDK 的源码:
git clone https://github.com/Intel-Media-SDK/MediaSDK msdk
进入目录:
cd msdk
这里有一个大坑,我们使用 apt 安装的 libva
版本是 1.7,然而最新的 MediaSDK 需要的 libva 版本要更高,所以在 cmake 的过程就会报错。我们需要的是跳回旧的 MediaSDK 版本即可。
# 使用 Media SDK 20.1.1 的版本
git checkout abb56fa
接下来就可以开始编译了:
mkdir build && cd build
cmake ..
make
# 如果没有报错,可以执行安装
sudo make install
安装完成后,需要再完善以下环境变量的配置,同样修改 .bashrc
或者 .zshrc
:
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/
export LIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri/
export LD_LIBRARY_PATH=/opt/intel/mediasdk/lib/
完成上述步骤,就可以开始 ffmpeg 编译了。
首先还是先下载源码:
git clone https://github.com/ffmpeg/ffmpeg
接下来可以开始编译:
cd ffmpeg
./configure --arch=x86_64 --disable-yasm --enable-vaapi --enable-libmfx
make
# 如果没有报错 即可安装
sudo make install
到这里,我们的 全部步骤都已经完成了。
最后,可以测试一下 ffmpeg 是否能正常已经安装好了 qsv:
ffmpeg -codecs | grep qsv
ffmpeg version N-102538-g0bdd677c5f Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 9 (Ubuntu 9.3.0-17ubuntu1~20.04)
configuration: --arch=x86_64 --disable-yasm --enable-vaapi --enable-libmfx
libavutil 57. 0.100 / 57. 0.100
libavcodec 59. 1.100 / 59. 1.100
libavformat 59. 2.100 / 59. 2.100
libavdevice 59. 0.100 / 59. 0.100
libavfilter 8. 0.101 / 8. 0.101
libswscale 6. 0.100 / 6. 0.100
libswresample 4. 0.100 / 4. 0.100
D.V.L. av1 Alliance for Open Media AV1 (decoders: av1 av1_qsv )
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_qsv ) (encoders: h264_qsv h264_v4l2m2m h264_vaapi )
DEV.L. hevc H.265 / HEVC (High Efficiency Video Coding) (decoders: hevc hevc_qsv hevc_v4l2m2m ) (encoders: hevc_qsv hevc_v4l2m2m hevc_vaapi )
DEVIL. mjpeg Motion JPEG (decoders: mjpeg mjpeg_qsv ) (encoders: mjpeg mjpeg_qsv mjpeg_vaapi )
DEV.L. mpeg2video MPEG-2 video (decoders: mpeg2video mpegvideo mpeg2_v4l2m2m mpeg2_qsv ) (encoders: mpeg2video mpeg2_qsv mpeg2_vaapi )
D.V.L. vc1 SMPTE VC-1 (decoders: vc1 vc1_qsv vc1_v4l2m2m )
DEV.L. vp8 On2 VP8 (decoders: vp8 vp8_v4l2m2m vp8_qsv ) (encoders: vp8_v4l2m2m vp8_vaapi )
DEV.L. vp9 Google VP9 (decoders: vp9 vp9_v4l2m2m vp9_qsv ) (encoders: vp9_vaapi vp9_qsv )
可以看到,这里我们已经安装好了支持 qsv 的ffmpeg了。
虽然到这里,大部分的工作已经完成。然而,配置好的 ffmpeg 在转码某些视频的时候,会出现下面有绿边的情况,具体还没找到解决的方法。
所以,准备开始去研究新坑了。
如果文章对你有帮助,请不要忘记点赞、收藏、关注哦。