後日、問題が発覚したのでこちらを参照下さい(2019年1月追記)
自宅のサーバたちを長らく使ってきたCentOSからUbuntuへリプレイスしていく。Ubuntuにはデスクトップ版とサーバ版があるんだけど、検証で使っているDesk mini 110にはサーバ版が入らなかったので、デスクトップ版をとりあえずインストール。我が家でUbuntuを本格的に利用するにはIntel CPUを使ったハードウェア・エンコーディングを確立する必要がある。いわゆるQSVエンコードと言われているやつ。もちろんソフトウェア・エンコーディングでも問題はないんだけど、デグレードさせてまで別のOSにしたくはないし。
なぜ、UbuntuでQSVエンコードが難しいかと言うと、Intelが出しているIntel Media Server StudioというSDKが、CentOS7向けに作られているから。一応、Genericインストールという方法も用意されているんだけど、これがまあ、うまくいかない。海外のサイトで成功しているようなページを見かけたんだけど、私はうまくいかなかった。とはいえ、そのSDKも2018年版が出たし、Ubuntuは18.04になったし、そろそろ挑戦してみてもよさそうな頃合い。用意されている手順は古いUbuntuでしか通用しなそうなので、ググって手順を探す。
すると願ってもいないことに、Ubuntu wikiにQSVの情報が。そのまま実行できるような内容だったので試してみる。結果から言うと、iHDドライバのインストールは出来たものの、ffmpegのコンパイルでh264_qsvエンコーダを組み込むことが出来ない。もろもろ試してみたんだけど。思い返してみると、16.04のときもそれで諦めた気がする。ちなみにffmpeg3系以降はh264_vaapiエンコーダはデフォルトで組み込まれているんだね。もう少し調べてみると、Ubuntu 18.04は最初からi965ドライバが組み込まれているっぽい??
失うものも少ないので、さくっとUbuntu18.04を再インストール。直後にvainfoをインストールして確認してみると、おお、最初からi965ドライバが入っている。早速、ffmpegを入れてvaapiを使ったハードウェア・エンコーディングを試してみる。問題なく動作したが、案の定その品質は推して知るべし。この点は何ら改善されていないのですね。。。ダメ元でもう1度iHDドライバを作成してffmpegをコンパイルし直す。変化なし。動作確認のために、一応vaapiでハードウェア・エンコーディングが出来ているか試す。出来た。動画を確認するとメチャクチャきれい!!えええっ!?
一体、どんな変化が起きたのか整理してみる。ハードウェア・エンコーディングにはvaapiを使ったんだけど、ffmpegコンパイルの過程でドライバがiHDドライバに切り替わっていたんですね。つまりiHDドライバというのはvaapiでも利用可能であると。そして画質の美しさはエンコーダによるものではなく、ドライバに依存するものであると。この辺、ほとんど詳しいことは知らないので変なこと言ってたらすみません。ちなみにSDK付属のiHDドライバも試してみたんだけど、こちらではvaapiは動かず。何度か試して確立した手順が以下。
apt update
apt install -y autoconf automake cmake g++ libtool pkg-config libva-dev libdrm-dev libpciaccess-dev libx11-dev vainfo
mkdir -p ~/vaapi
cd ~/vaapi
git clone https://github.com/01org/libva
cd libva
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
make
make install
ldconfig
mkdir -p ~/vaapi/workspace
cd ~/vaapi/workspace
git clone https://github.com/intel/gmmlib
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE= Release -DARCH= 64 ../gmmlib
make
cd ~/vaapi/workspace
git clone https://github.com/intel/media-driver
cd media-driver
git submodule init
git pull
mkdir -p ~/vaapi/workspace/build_media
cd ~/vaapi/workspace/build_media
cmake ../media-driver \
-DMEDIA_VERSION="2.0.0" \
-DBS_DIR_GMMLIB=$PWD/../gmmlib/Source/GmmLib/ \
-DBS_DIR_COMMON=$PWD/../gmmlib/Source/Common/ \
-DBS_DIR_INC=$PWD/../gmmlib/Source/inc/ \
-DBS_DIR_MEDIA=$PWD/../media-driver \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_LIBDIR=/usr/lib/x86_64-linux-gnu \
-DINSTALL_DRIVER_SYSCONF=OFF \
-DLIBVA_DRIVERS_PATH=/usr/lib/x86_64-linux-gnu/dri
make
make install
export LIBVA_DRIVER_NAME=iHD
echo LIBVA_DRIVER_NAME=iHD >> /etc/environment
vainfo
あとはffmpegをインストールしてh264_vaapiを利用すれば、高速かつ高品質なQSVによるハードウェア・エンコーディングを体験することが出来る。ちなみにCPUはSkylakeのCore i3-6100で、その処理速度はffmpeg-3.4.4が5倍速、ffmpeg-4.0.2がなんと9倍速!!30分の動画データをわずか3分強で3分の1に圧縮してくれる。以前にCentOSでvaapiを試したときも5分くらいだったので、もともとvaapiは高速。それが更に早まった上に品質まで伴うなんて・・・。OSやハードウェアの制約からも逃れられそうだし、vaapi最高!!
add-apt-repository -y ppa:jonathonf/ffmpeg-4
apt install -y ffmpeg
ls -l test.ts
-rw-r--r-- 1 root root 3171777328 Oct 3 15:07 test.ts
time ffmpeg -y -nostdin -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -i test.ts -vf 'format=nv12|vaapi,hwupload,scale_vaapi=w=1280:h=720' -vcodec h264_vaapi -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 test.mp4
:
real 3m21.616s
user 1m29.892s
sys 0m22.497s
ls -l test.mp4
-rw-r--r-- 1 root root 1038153830 Oct 16 22:22 test.mp4