Ubuntu20.04 ffmpeg添加 Intel核显QSV加速支持

背景介绍

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 了。

Intel Media Driver for VAAPI 安装

因为我的系统是 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

Intel Media SDK 编译

首先先安装好依赖:

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 编译

完成上述步骤,就可以开始 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 在转码某些视频的时候,会出现下面有绿边的情况,具体还没找到解决的方法。

所以,准备开始去研究新坑了。

如果文章对你有帮助,请不要忘记点赞、收藏、关注哦。

你可能感兴趣的:(Linux,-,虚拟化,-,运维,Coding,Note,ffmpeg,ubuntu,intel,qsv)