長きに渡って悩んできた、LinuxでのQSV。前回、VAAPIにiHDドライバを適用することでUbuntuでの実績を作れたが、実はBSの録画データにおいて、深刻なブロックノイズが何度か発生。例えば、妖怪ウォッチとかBリーグの試合とか。見るに堪えないほど頻繁にブロックノイズが発生し続けてしまう。ちなみに地上波で同じような問題は確認していない。もしかしたら、うちの環境がいけないのかもしれないけど。とはいえ、このままでは納得いかないので、録画機を一旦CentOSに戻すことにした。
CentOSでQSV対応するのは、もうお手のもの。当時最新のCentOS 7.5とIntel Media Server Studio 2018R1を使う。しかし、相変わらずZ270チップセットだとQSVに対応したkernelでOSを起動する事ができない。これはもう全世界的に公然の事実だと思うのだが、何故か騒いでいるのは私だけ。うちのメインであるZ270機は諦めて、H110チップセットのDeskMini 110で動かしてみる。とりあえずOSは起動するようになった。SDKに同梱されているtest_streamもPASSしたのでffmpegを作ってみる。
cd /usr/local/src
tar xf MediaServerStudioEssentials2018R1.tar.gz
cd /usr/local/src/MediaServerStudioEssentials2018R1
tar xf SDK2018Production16.8.tar.gz
cd /usr/local/src/MediaServerStudioEssentials2018R1/SDK2018Production16.8/Generic
tar xf intel-linux-media_generic_16.8-69021_64bit.tar.gz
tar xf intel-opencl-16.8-67208.x86_64.tar.xz
tar xf intel-opencl-cpu-16.8-67208.x86_64.tar.xz
tar xf intel-opencl-devel-16.8-67208.x86_64.tar.xz
unalias cp
cp -r etc/* /etc
cp -r lib/* /lib
cp -r opt/* /opt
cp -r usr/* /usr
yum install -y git fakeroot gcc gcc-c++ ncurses-devel bzip2 patch openssl-devel bc
cd /usr/local/src
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.111.tar.gz
tar xf linux-4.4.111.tar.gz
cp /opt/mediasdk/opensource/patches/kmd/4.4.111/intel-kernel-patches.tar.bz2 .
tar xf intel-kernel-patches.tar.bz2
cd linux-4.4.111
for i in ../intel-kernel-patches/*.patch; do patch -p1 < $i; done
make olddefconfig
time make -j 8
make modules_install
make install
今まで実績のあるffmpeg2.8系から試すが、コンパイルも問題なく通ってQSV圧縮も動作した。しかし、3倍速程度なのでffmpeg4系に比べると遅く感じる。ついでにffmpeg4も試してみることにしたのだが、動かしてみると見覚えのあるエラー。実はUbuntuでQSV圧縮を試した際に起きたエラーと同一だったのだ。今回のCentOS機はffmpeg2によるQSV圧縮は動作していたので、このQSVのエラーはffmpeg4の問題であると絞り込むことが出来た。よくよく考えれば、ffmpeg4で一度もQSV圧縮が成功していない事実に気が付く。
mkdir /opt/intel/mediasdk/include/mfx
cp /opt/intel/mediasdk/include/*.h /opt/intel/mediasdk/include/mfx
cat<<"EOF">/usr/lib64/pkgconfig/libmfx.pc
prefix=/opt/intel/mediasdk
exec_prefix=${prefix}
libdir=${prefix}/lib/lin_x64
includedir=${prefix}/include
Name: libmfx
Description: Intel Media SDK
Version: 16.5
Libs: -L${libdir} -lmfx -lva -lstdc++ -ldl -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm
EOF
cd /usr/local/src
git clone https://github.com/FFmpeg/FFmpeg
cd FFmpeg
PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig:/opt/intel/mediasdk/lib/pkgconfig" ./configure \
--pkg-config-flags="--static" \
--prefix=/usr/local/ffmpeg \
--bindir="$HOME/bin" \
--extra-cflags="-I/opt/mediasdk/include" \
--extra-ldflags="-L/opt/mediasdk/lib" \
--extra-ldflags="-L/opt/mediasdk/plugins" \
--enable-libmfx \
--enable-vaapi \
--enable-opencl \
--disable-debug \
--enable-libvorbis \
--enable-libvpx \
--enable-libdrm \
--enable-gpl \
--cpu=native \
--enable-libx264 \
--enable-libx265 \
--extra-libs=-lpthread \
--enable-nonfree
time make -j 8
make install
QSV圧縮の実績があるOSは出来たので、この環境で何としてでもffmpeg4を動かすことに集中する。ffmpeg4のQSV実績を作れれば、UbuntuでのQSVも可能になるかもしれない。とりあえずffmpeg3系も試してみたんだけど3.4でも動作しない。ぐぐって実績のありそうな3.2を試してみると成功。むむ。どうやら、この辺を境にQSVのオプションが大きく変わったのかもしれない。ffmpeg4でQSVをおこなってるドキュメントは少ないんだけど、あちこちで探し回って試行錯誤を繰り返す。そして遂に発見!!
ffmpeg -y -nostdin -hwaccel qsv -vcodec mpeg2_qsv -i test.ts -vcodec h264_qsv -preset medium -tune film -vb 4M -vf scale_qsv=1280:720 -acodec copy -threads 0 qsv.mp4
このコマンドでffmpeg3.4でもQSV圧縮が出来るようになった。3.2以前とは大分変わるんだね。改めてffmpeg4を作り直して確認してみると、同じコマンドで動作した!!うーん、環境は少しずつ変化させるべき、ということをつくづく思い知らされる事象でした。ちなみにこのコマンドだと10倍速くらいで処理できるんだけど、deinterlaceしていないことに気が付いて、それを加えてみると4倍速程度に落ち着いた。ffmpeg4の動作実績ができたので、いよいよ次回はUbuntuでのQSV環境構築にリトライする。
ffmpeg -y -nostdin -hwaccel qsv -vcodec mpeg2_qsv -i test.ts -vcodec h264_qsv -preset medium -tune film -vb 4M -vf deinterlace_qsv,scale_qsv=1280:720 -acodec copy -threads 0 qsv.mp4
vaapiでBS(おそらくmpeg2 adな局)が崩れるのは↓のコミットを当てると解消されますよ
https://github.com/0p1pp1/FFmpeg/commit/311716da96fd203b28165ec1c4789ec46f46aaa7
こ、これは素晴らしい情報提供ありがとうございます。
是非とも時間見つけて再現試験してみます。
QSVだとkernel固定されるのが不便なので、VAAPIに戻せると嬉しいですねー。