録画サーバ構築 QSVエンコード VAAPI編

QSVエンコードを再考する。現在はCentOS7.2でIntel MSS 2017を使ってハードウェアエンコードしている。録画処理時に並行してリアルタイムエンコードをしていると、たまにffmpegがハングしてしまう。ハングしたプロセスは割り込み不可となるため、OS再起動以外に消す方法はない。放置していても問題にはならないんだけど、録画処理を行っているlxcコンテナを再起動できなくなったりするのが不便。割り込み不可のプロセスがいる状態でコンテナを再起動すると、停止も起動もできなくなってしまう。

[新品] インテル Core i3 6100 BOX LGA1151
価格 : 12,800円(税込、送料無料)
by Yahoo! ショッピング

また、Intel MSSはCentOS7.2をGold OSとして推奨しており、CentOS7.3にはまだ対応していない。Generic Installなら可能だけど、kernelを4系に引き上げる必要が出てきてしまう。QSV利用のための構成硬直化は避けたいという考えもあって別の方法を試してみることに。今回は以前から気になっていたVAAPIによるQSVエンコードがどの程度実用的かを検証してみたい。VAAPIでの運用が実現すればOSの自由度も上がるし、kernelとの依存度が低そうなのでハングしても割り込めそうだし。

まずはintel MSSのドライバからvaapi-intel-driverに差し替える。ドライバの削除はintel-linux-media-16.5-55964.el7.x86_64というパッケージを消せばよい。vaapi-intel-driverはnux-dextopからインストール可能だが、versionが古いせいかskylakeだとsegfaultしてしまい認識してくれなかった。とりあえずfedoraの最新のrpmソースをダウンロードしてrpmbuildしてみる。vaapi-intel-driveに合わせてvaapi関連のパッケージも入れ直す必要がある。こちらもfedora版を使ってみた。

yum remove -y intel-linux-media vaapi*
cd /usr/local/src
wget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/linux/updates/25/SRPMS/l/libva-1.7.3-3.fc25.src.rpm
wget ftp://ftp.pbone.net/mirror/rpmfusion.org/free/fedora/updates/25/SRPMS/l/libva-intel-driver-1.7.3-2.fc25.src.rpm
rpm -ivh *.src.rpm
cd ~/rpmbuild/SPEC
yum install --enablerepo=nux-dextop libudev-devel libXext-devel libXfixes-devel libdrm-devel libpciaccess-devel mesa-libEGL-devel mesa-libGL-devel mesa-libGLES-devel wayland-devel libwayland-server-devel libwayland-client-devel
rpmbuild -ba libva.spec
cd ../RPMS/x86_64
yum install libva-1.7.3-3.el7.centos.x86_64.rpm libva-devel-1.7.3-3.el7.centos.x86_64.rpm libva-utils-1.7.3-3.el7.centos.x86_64.rpm
cd ../../SPEC
rpmbuild -ba libva-intel-driver.spec
cd ../RPMS/x86_64
yum install libva-intel-driver-1.7.3-2.el7.centos.x86_64.rpm
vainfo

最後のvainfoが正しく表示されればOK。続いて、vaapiに対応したffmpegを作る。vaapiの対応は3.1系以降らしい。知らずに2.8系で作ってみたけど全然対応せず。3系だとcomskipが対応できないから、そこの棲み分け考えるのも面倒。とりあえずは検証のためにnux-dextopから2系のsrc.rpmを落として、そこに3.1系のソースを配置。SPECファイル内のversionを修正してrpmbuildしたらうまくいった。

cd /usr/local/src
wget https://li.nux.ro/download/nux/dextop/el7/SRPMS/ffmpeg-2.6.8-3.el7.nux.src.rpm
rpm -ivh ffmpeg-2.6.8-3.el7.nux.src.rpm
cd /root/rpmbuild/SOURCES
wget http://ffmpeg.org/releases/ffmpeg-3.1.9.tar.bz2
cd ../SPECS
cp ffmpeg.spec _ffmpeg.spec
vi ffmpeg.spec
diff -u _ffmpeg.spec ffmpeg.spec
    :
-Version:        2.6.8
+Version:        3.1.9

yum install --enablerepo=epel,nux-dextop bzip2-devel faac-devel fdk-aac-devel freetype-devel gnutls-devel gsm-devel lame-devel ladspa-devel libass-devel libcdio-paranoia-devel libdc1394-devel libmodplug-devel libtheora-devel libv4l-devel libvdpau-devel libvorbis-devel libXvMC-devel openal-soft-devel openjpeg-devel opus-devel pulseaudio-libs-devel schroedinger-devel SDL-devel soxr-devel speex-devel texinfo x264-devel x265-devel xvidcore-devel yasm

rpmbuild -ba ffmpeg.spec
cd ../RPMS/x86_64
yum install ffmpeg-2.8.11-3.el7.centos.x86_64.rpm ffmpeg-libs-2.8.11-3.el7.centos.x86_64.rpm libavdevice-2.8.11-3.el7.centos.x86_64.rpm
ffmpeg -hwaccels
    :
vaapi

ffmpeg -encoders | grep vaapi
    :
 V..... h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 V..... hevc_vaapi           H.265/HEVC (VAAPI) (codec hevc)

以上でvaapiのffmpegが作れたので早速試してみた。発行したのは以下のコマンド。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

【送料無料】 インテル Core i3 – 6100 BOX品 [CPU]
価格:12808円(税込、送料無料) (2017/8/31時点)

time ffmpeg -y -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' -c:v h264_vaapi -s 1280x720 -vb 4500k -acodec aac -strict -2 -ac 2 -ar 48000 -ab 128k -threads 0 h264_vaapi.mp4

30分の録画データをわずか5分でエンコードしてくれたものの画質は非常に劣化していた。特に暗めのグラデーション部分におけるブロックノイズがどうしても目に付く。以前、nvencでエンコードした時も同様の感想だったんだけど、intel MSSのQSVエンコードは比べものにならないくらいきれい。これに一度慣れてしまうと、他のハードウェアエンコードは使う気になれないかも。という訳で、次回はIntel MSSをGeneric Installして、CentOS7.3に対応させることを目指す。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)