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

Linux
この記事は約7分で読めます。

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

  • ハードウェアエンコードについての知識
  • エンコーダーについての知識
  • 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様アドバイスありがとうございました!)
(2021年2月24日編集:すず様アドバイスありがとうございました!)

# 環境の最新化
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 opencl-clhpp-headers git
# 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上でハードウェアエンコードが実行できるようになりました。

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

Ubuntu20.04にhevc-qsvコーデックを実装する(後編)
まえがき前回はffmpegの導入と各種コーデックの導入を行い、環境構築自体は完了しました。今回は各種コーデックによる違いを変換時間や画質の違いから見ていきます。まず最初に今回の比較に用いた実行環境の振り返ります。CPU:Intel 1070…

コメント

  1. kay より:

    構築手順を共有していただき、ありがとうございます。
    非常に捗りました(自力構築は無理でした)。

    2点ほど気になりましたので、ご報告させていただきます。

    (1)下記(44-47行)、ffmpeg導入前なので確認できませんでした
    ># vaapiが導入されていることを確認
    >/usr/local/ffmpeg/bin/ffmpeg -hwaccels 2>/dev/null | grep vaapi
    ># 利用できるようになったコーデックの確認
    >/usr/local/ffmpeg/bin/ffmpeg -encoders 2>/dev/null | grep vaapi

    (2)下記(56行)、記述に誤りがあるようです。
    >cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_WAYLAND=ON -DENABLE_X11_DRI3=ON -DENABLE_OPENCL=ON ../msdkmake

    ↓下記のように修正して実行しましたが…
    >cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_WAYLAND=ON -DENABLE_X11_DRI3=ON -DENABLE_OPENCL=ON ../msdk
    >make

    エラーが発生して、これ以上進めることができませんでした。
    ————————
    — Intel OpenCL SDK was not found (optional). The following will not be built: rotate_opencl plugin.
    — Intel(R) Media SDK was found here /home/epgstation/git/msdk
    — Enabling API 1.33 feature set with flags
    — CMAKE_INSTALL_PREFIX=/opt/intel/mediasdk
    — Checking for module ‘libmfx>=1.28’
    — No package ‘libmfx’ found
    — Checking for module ‘wayland-client’
    — No package ‘wayland-client’ found
    CMake Error at /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:463 (message):
    A required package was not found
    Call Stack (most recent call first):
    /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:643 (_pkg_check_modules_internal)
    builder/FindPackages.cmake:513 (pkg_check_modules)
    CMakeLists.txt:100 (include)
    ————————-

    パッケージが不足しているようなので、下記のように追加したところcmakeが通りました。
    >sudo apt-get install libva-dev libmfx-dev intel-media-va-driver-non-free

    ※下記サイトを参考にしました
    https://github.com/Intel-Media-SDK/MediaSDK/wiki/Build-and-use-ffmpeg-with-MediaSDK

    • 結月 悠 より:

      kay 様

      お返事遅れてしまい、申し訳ありません。
      この度はコメント誠にありがとうございました!

      ご指摘いただいた点ですが、記事に反映させていただきました!
      ・vaapiの記載場所を変更
      ・makeに関しては改行を追加
      ・パッケージに関しては環境の違いもあるかとは思いますが、追加させていただきました

      ffmpegによるエンコード環境構築の方にとって少しでもお力になれてよかったです。
      また遊びに来ていただければ幸いです。

  2. ゴンティくん より:

    5行目ですがスペースが何箇所か抜けています。
    正しくは下記かと思いますので修正をお願い致します。
    sudo apt install cmake makeautoconf automake libtoolg++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

    • 結月 悠 より:

      ゴンティくん 様

      コメント誠にありがとうございます。
      こちらプラグインの仕様になっておりまして、コピー前にダブルクリックにてコピーモードにしていただく
      もしくはコピペをするとスペースは正常に入っているかと思います。
      わかりにくく申し訳ありませんがご確認いただければ幸いです。

      • 結月 悠 より:

        ゴンティくん 様

        プラグインを変更させていただきました!
        ご不便おかけして申し訳ありませんでした。
        今後も遊びに来ていただければ幸いです。

  3. すず より:

    最近のCPUでQSVを使用できる環境を構築する記事がほとんどなく、大変助かりました。

    こちらの環境の違いや読み飛ばしがあったかもしれないのですが、
    途中で詰まってしまったところがありましたので、コメントさせていただきます。

    # Intel-Media-SDKのインストール
    のmakeを行い、下記のようなエラーが表示されてしまいました。

    [ 15%] Building CXX object samples/sample_plugins/rotate_opencl/CMakeFiles/sample_plugin_opencl.dir/src/opencl_filter.cpp.o
    In file included from /home/XXX/git/msdk/samples/sample_plugins/rotate_opencl/src/opencl_filter.cpp:24:
    /home/XXX/git/msdk/samples/sample_plugins/rotate_opencl/include/opencl_filter.h:31:10: fatal error: CL/cl2.hpp: No such file or directory
    31 | #include

    その際に下記のapt-getを行ったところ、makeができるようになりました。
    apt-get install opencl-clhpp-headers

    OSのバージョンやgitのリビジョンで変わってくるかもしれないですが、同様のエラーが出てしまった方の助けになればと思います。

    環境:
    Ubuntu Server 20.04.2 LTS

    • 結月 悠 より:

      すず 様

      お返事遅れてしまい、申し訳ありません。
      この度はコメント誠にありがとうございました!

      ご指摘いただいた点ですが、記事に反映させていただきました!
      おそらくライブラリ関係ですので、他のミドルウェアのインストール関係なのでインストールされていたのかもしれません。
      OSを最小構成でインストールされている状態で検討すべきでした(汗

      こんなニッチな記事でもエンコード環境構築の方にとって少しでもお力になれてよかったです。
      また遊びに来ていただければ幸いです。

  4. Intel Gemini Lake User より:

    Thanks to your manual, I finally managed to get QSV enabled correctly on my own server and here are some of the minor problems I encountered during the deployment process and the corresponding solutions that I hope you can add to this manual so that it can help more people.

    # 08/06/2021: Intel Gemini Lake like J4125 rendering issue like https://github.com/intel/media-driver/issues/733, so need Meida-Driver and Intel-Media-SDK minmum 20.4.5, and for dependency reason, need libva libva-utils both at minimum 2.11.0, gmmlib 21.1.1 respectivly.
    # ———— Quick Snapshot before to compilate ffmpeg in vainfo —————
    # libva info: VA-API version 1.12.0
    # libva info: Trying to open /usr/local/lib/dri/iHD_drv_video.so
    # libva info: Found init function __vaDriverInit_1_12
    # libva info: va_openDriver() returns 0
    # vainfo: VA-API version: 1.12 (libva 2.12.0.pre1)
    # vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics – 21.2.2 (66fa14da)
    # ——————————————————————————–

    # May add the user to “render” group or you may got error like —-
    # [h264_qsv @ 0x55dc44a64640] Failed to create a VAAPI device.
    # Error initializing output stream 0:0 — Error while opening encoder for output stream #0:0 – maybe incorrect parameters such as bit_rate, rate, width or height
    # [aac @ 0x55dc44ac7980] Qavg: 42114.402
    # [aac @ 0x55dc44ac7980] 2 frames left in the queue on closing
    usermod -aG video,render $(whoami)
    # after that you should re-login or reboot (better option to actually configure everthing)

    By the way
    Your anti-Bot mechanism is not very friendly and is a nearly impossible task for people who would like to help refine the manual and don’t speak Japanese. (Although they will read the article content through translation software like I do)

  5. とおりすがり より:

    up主さんへ: スクリプトありがとうございます。素環境でcloneが出来なかったので、apt installにgitを加えて下さい。

    Intel Gemini Lake User: Haha, BBS on anonymous user in Japan have vulnerable for spammer-post and likes. The japanese-signature image just made gating script effects! 🙂

タイトルとURLをコピーしました