Ubuntu20.04にhevc-qsvコーデックを実装する(前編)

2020年12月31日

この記事を読むと得られる情報

  • ハードウェアエンコードについての知識
  • エンコーダーについての知識
  • Ubuntu20.04へのh.264とhevcのハードウェアエンコーダーの導入方法

概要

UbuntuのCLI環境でも利用できる動画変換ソフト【ffmpeg】で動画変換を行おうとしたところ
デフォルトの環境ではh.265(以下、hevc)の計算をintelグラフィックアクセラレータを使用したIntel Quick Sync Video(以下、qsv)が実行できなかった。
その後環境構築をしたところ、いろんな箇所でハマったのでうまくいった方法をまとめた記事になります。

ハードウェアエンコードとは

通常、動画のエンコードはCPUの計算リソースを利用(以下、ソフトウェアエンコード)して行われます。
一方、ハードウェアエンコードはNVIDIAやAMDのグラフィックボードやIntel社製CPUに内臓されているグラフィックチップの計算リソースをFPGAのような専用回路として利用してエンコードを行うことである。

そんなハードウェアエンコードには下記のようなメリットとデメリットが存在する。

メリット

  • CPUリソースをメインで消費しないため、他の演算処理中にも実施ができる
  • 速度が桁違いに早い
  • 消費電力も大きく抑えられる

デメリット

  • ソフトウェアエンコードに比べ、画質は劣る可能性がある(ある程度回避可能)

今回はIntel CPUを用いたハードウェアエンコードであるQSV環境を構築していきます。
(NVIDIAのグラフィックボードを利用したNVENCなどは別途構築が必要となります)

コーデックについて

前項では「エンコード自体をどのリソースを使用して計算するのか」という点で様々な方法があるという話をしましたが、動画変換にはもう一つの要素であるコーデックについても検討しなければいけません。

様々なコーデックがあり、それぞれにメリット・デメリットがありますが今回は汎用性の高いmp4へ変換するh.264とhevcについて検討していきます。
h.264とhevcについての詳細は長くなるため、ここでは省略させていただきます。

とはいえ1点重要な注意事項があり、基本的に各コーデックをハードウェアエンコードで実施する場合はハードウェアが対応している必要があります。
具体的に言いますと
・h.264は第2世代以降のIntel CPU
・hevcは第7世代以降のIntel CPU
でないと使用することができません。

hevcはh.264の後継コーデックのため割と最近のIntel CPUが必要なのです。

hevc-qsvコーデック環境を構築

それでは環境構築に移りたいと思います。
まずは構築する環境の確認

  • CPU:Intel 10700T(TB無効)
  • RAM:64GB
  • OS:Ubuntu20.04

いよいよ構築していきます。
基本的にはコピペで構築可能かと思います。
(2020年9月20日編集:kay様アドバイスありがとうございました!)

# 環境の最新化
sudo apt update
sudo apt dist-upgrade
# 必要パッケージのインストール
sudo apt install cmake make autoconf automake libtool g++ bison libpcre3-dev pkg-config libtool libdrm-dev xorg xorg-dev openbox libx11-dev libgl1-mesa-glx libgl1-mesa-dev libpciaccess-dev libfdk-aac-dev libvorbis-dev libvpx-dev libx264-dev libx265-dev ocl-icd-opencl-dev pkg-config yasm libx11-xcb-dev libxcb-dri3-dev libxcb-present-dev libva-dev libmfx-dev intel-media-va-driver-non-free

# libvaのインストール
mkdir ~/git && cd ~/git
git clone https://github.com/intel/libva
cd libva
./autogen.sh
make
sudo make install

# libva-utilsのインストール
cd ~/git
git clone https://github.com/intel/libva-utils
cd libva-utils
./autogen.sh
make
sudo make install

# gmmlibのインストール
cd ~/git
git clone https://github.com/intel/gmmlib
cd gmmlib
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE= Release -DARCH=64 ../
make
sudo make install

# Intel-Media-Driverのインストール
cd ~/git
git clone https://github.com/intel/media-driver
mkdir build_media && cd build_media
cmake ../media-driver
make -j"$(nproc)"
sudo make install

# Intel-Media-Driverで生成されたライブラリをffmpegで使用するために移動
sudo mkdir -p /usr/local/lib/dri
sudo cp ~/git/build_media/media_driver/iHD_drv_video.so /usr/local/lib/dri/

# Intel-Media-SDKのインストール
cd ~/git
git clone https://github.com/Intel-Media-SDK/MediaSDK msdk
cd msdk
git submodule init
git pull
mkdir -p ~/git/build_msdk && cd ~/git/build_msdk
cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_WAYLAND=ON -DENABLE_X11_DRI3=ON -DENABLE_OPENCL=ON  ../msdk
make
sudo make install
sudo su -
echo '/opt/intel/mediasdk/lib' > /etc/ld.so.conf.d/imsdk.conf
exit
sudo ldconfig

# 最新版ffmpegの構築
cd ~/git
git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg
PKG_CONFIG_PATH=/opt/intel/mediasdk/lib/pkgconfig ./configure \
  --prefix=/usr/local/ffmpeg \
  --extra-cflags="-I/opt/intel/mediasdk/include" \
  --extra-ldflags="-L/opt/intel/mediasdk/lib" \
  --extra-ldflags="-L/opt/intel/mediasdk/plugins" \
  --enable-libmfx \
  --enable-vaapi \
  --enable-opencl \
  --disable-debug \
  --enable-libvorbis \
  --enable-libvpx \
  --enable-libdrm \
  --enable-gpl \
  --cpu=native \
  --enable-libfdk-aac \
  --enable-libx264 \
  --enable-libx265 \
  --extra-libs=-lpthread \
  --enable-nonfree
make
sudo make install

# vaapiが導入されていることを確認 
/usr/local/ffmpeg/bin/ffmpeg -hwaccels 2>/dev/null | grep vaapi 
# 利用できるようになったコーデックの確認 
/usr/local/ffmpeg/bin/ffmpeg -encoders 2>/dev/null | grep vaapi 

次回に続く

これでffmpeg上でハードウェアエンコードが実行できるようになりました。

次回は今回導入したエンコーダーを利用したハードウェアエンコードの実行方法と、ソフトウェアエンコードとハードウェアエンコードの比較を行っていきます。