UbuntuとQSV

H97 Pro4は修理に出して、再びUbuntuでのハードウェアエンコード環境構築に着手。

2015年9月にIntel® Media Server StudioのCommunity Editionが無償公開されたので、予てよりこそこそとトライしていたのだが、対応するCPU世代がHaswell以降に限定されてたり、カーネルのカスタマイズ(rebuild)が必要なことからCentOSやカーネル版数の縛りが避けられずUbuntuでの環境構築になかなか難儀。昨年9月公開のIntel Media Server Studio 2017ではカーネルのrebuildも不要になったという噂も耳にしたが、CentOSとUbuntuでは話が異なる事から鵜呑みにするわけにも行かず。

Intel® Media Server StudioではなくVAAPI経由でffmpegから気軽にQSVを使えるレポートがtappieさんから報告されていたので、試してみる事に。

まずはVAAPIドライバのインストール。

yano@haswell:~$ sudo apt-get update
yano@haswell:~$ sudo apt-get install libva1 vainfo i965-va-driver
yano@haswell:~$ vainfo
error: can't connect to X server!
libva info: VA-API version 0.39.2
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_38
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.1)
vainfo: Driver version: Intel i965 driver for Intel(R) Haswell Desktop - 1.6.1.pre1 (1.6.1.pre1)
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
yano@haswell:~$ ls -n /dev/dri
total 0
crw-rw----+ 1 0 44 226,   0 Jan 12 22:30 card0
crw-rw----  1 0 44 226,  64 Jan 12 22:30 controlD64
crw-rw----+ 1 0 44 226, 128 Jan 12 22:30 renderD128

と/dev/dri配下にrenderD128ができれば(恐らく)OK。 続いてCompilationGuide/Ubuntuを読みながら、ffmpegのインストール。

yano@haswell:~$ sudo apt-get install autoconf automake build-essential libass-dev libfreetype6-dev \
    libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev \
    libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev
yano@haswell:~$ sudo apt-get install yasm libx264-dev libfdk-aac-dev libmp3lame-dev
yano@haswell:~$ wget http://ffmpeg.org/releases/ffmpeg-3.2.2.tar.bz2
yano@haswell:~$ tar xvf ffmpeg-3.2.2.tar.bz2
yano@haswell:~$ cd ~/ffmpeg-3.2.2
yano@haswell:~/ffmpeg-3.2.2$ mkdir ~/ffmpeg_build
yano@haswell:~/ffmpeg-3.2.2$ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" \
    ./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" \
    --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" \
    --bindir="$HOME/bin" --enable-gpl --enable-libass --enable-libfdk-aac \
    --enable-libfreetype --enable-libmp3lame --enable-libtheora --enable-libvorbis \
    --enable-libx264 --enable-nonfree \
    --enable-vaapi --enable-hwaccel=h263_vaapi --enable-hwaccel=h264_vaapi \
    --enable-hwaccel=mpeg2_vaapi --enable-hwaccel=mpeg4_vaapi \
    --enable-hwaccel=vc1_vaapi --enable-hwaccel=wmv3_vaapi
yano@haswell:~/ffmpeg-3.2.2$ PATH="$HOME/bin:$PATH" make
yano@haswell:~/ffmpeg-3.2.2$ make install
yano@haswell:~/ffmpeg-3.2.2$ make distclean
yano@haswell:~/ffmpeg-3.2.2$ hash -r

最後に↓でVAAPIのエンコーダオプションが確認できれば(恐らく)OK。

yano@haswell:~/ffmpeg-3.2.2$ ~/bin/ffmpeg -encoders 2>/dev/null | grep vaapi
 V..... h264_vaapi           H.264/AVC (VAAPI) (codec h264)
 V..... hevc_vaapi           H.265/HEVC (VAAPI) (codec hevc)
 V..... mjpeg_vaapi          MJPEG (VAAPI) (codec mjpeg)
yano@haswell:~/ffmpeg-3.2.2$

で、早速エンコード動作の確認。画質の調整パラメータはqp一択という事なので、10~30で廻してみた。

yano@haswell:~/qsv$ for qp in 10 15 20 25 30;do \
  (time ~/bin/ffmpeg \
    -vaapi_device /dev/dri/renderD128 \
    -hwaccel vaapi \
    -hwaccel_output_format vaapi \
    -i ./input.ts \
    -map 0:0 -map 0:1 \
    -analyzeduration 30M \
    -probesize 30M \
    -vf 'format=nv12|vaapi,hwupload' \
    -c:v h264_vaapi \
    -level 40 \
    -aspect 16:9 \
    -qp ${qp} \
    -c:a copy \
    ./ffmpeg_1080p_qp${qp}.mp4 \
  ) 2>&1 | tee ffmpeg_1080p_qp${qp}.log;done
yano@haswell:~/qsv$ grep -e "^real" -e "^video:" ffmpeg_1080p_qp*.log
ffmpeg_1080p_qp10.log:video:569969kB audio:4756kB subtitle:0kB other …
ffmpeg_1080p_qp10.log:real      0m25.778s
ffmpeg_1080p_qp15.log:video:275235kB audio:4756kB subtitle:0kB other …
ffmpeg_1080p_qp15.log:real      0m28.198s
ffmpeg_1080p_qp20.log:video:123861kB audio:4756kB subtitle:0kB other …
ffmpeg_1080p_qp20.log:real      0m25.051s
ffmpeg_1080p_qp25.log:video:56443kB audio:4756kB subtitle:0kB other …
ffmpeg_1080p_qp25.log:real      0m24.307s
ffmpeg_1080p_qp30.log:video:28922kB audio:4756kB subtitle:0kB other …
ffmpeg_1080p_qp30.log:real      0m24.123s
yano@haswell:~/qsv$ ll 20161215_0012_28_GRhd.ts ffmpeg_1080p_qp*.mp4
-rw-r--r-- 1 yano yano 281840952 Dec 15 00:14 20161215_0012_28_GRhd.ts
-rw-rw-r-- 1 yano yano 588511025 Jan 12 23:14 ffmpeg_1080p_qp10.mp4
-rw-rw-r-- 1 yano yano 286704102 Jan 12 23:14 ffmpeg_1080p_qp15.mp4
-rw-rw-r-- 1 yano yano 131696776 Jan 12 23:15 ffmpeg_1080p_qp20.mp4
-rw-rw-r-- 1 yano yano  62660787 Jan 12 23:15 ffmpeg_1080p_qp25.mp4
-rw-rw-r-- 1 yano yano  34478662 Jan 12 23:16 ffmpeg_1080p_qp30.mp4
yano@haswell:~/qsv$ for f in ffmpeg_1080p_qp*.mp4;do \
    ~/bin/ffmpeg -i $f;done 2>&1 | grep -e bitrate
  Duration: 00:02:29.68, start: 0.000000, bitrate: 31453 kb/s
  Duration: 00:02:29.68, start: 0.000000, bitrate: 15323 kb/s
  Duration: 00:02:29.68, start: 0.000000, bitrate: 7038 kb/s
  Duration: 00:02:29.68, start: 0.000000, bitrate: 3348 kb/s
  Duration: 00:02:29.68, start: 0.000000, bitrate: 1842 kb/s
yano@haswell:~/qsv$

2分半の地デジ番組(1440x1080)のmp4変換だが0m24.123s~0m28.198sで、概ね30秒弱(実時間の5分の1)という結果。qp指定値はbitrateとファイルサイズに影響するものの、処理時間には影響無し。ts原本(269MB)のビットレートが"14982 kb/s"だったので、qp=15だと原本相当(274MB)。qp=20だと諸々半分(126MB)。

ちなみに、消費電力は32→50W程度。Ivy BridgeのXeon E3-1225 v2とはいといろ違うのでTVMW6@Windows 10の結果と比べるのは微妙だが、数値的には期待以上の結果。

gt110bで6分以上かかった720p@x264の"2580 kb/s"(47MB)にフィットさせてみたところ、

yano@haswell:~/qsv$ ll -h ffmpeg_720p_qp*.mp4
-rw-rw-r-- 1 yano yano 99M  Jan 12 23:25 ffmpeg_720p_qp18.mp4
-rw-rw-r-- 1 yano yano 86M  Jan 12 23:25 ffmpeg_720p_qp19.mp4
-rw-rw-r-- 1 yano yano 74M  Jan 12 23:26 ffmpeg_720p_qp20.mp4
-rw-rw-r-- 1 yano yano 67M  Jan 12 23:26 ffmpeg_720p_qp21.mp4
-rw-rw-r-- 1 yano yano 54M  Jan 12 23:27 ffmpeg_720p_qp22.mp4
-rw-rw-r-- 1 yano yano 45M  Jan 12 23:27 ffmpeg_720p_qp23.mp4
-rw-rw-r-- 1 yano yano 40M  Jan 12 23:28 ffmpeg_720p_qp24.mp4
yano@haswell:~/qsv$ for f in ffmpeg_720p_qp*.mp4;do \
    ~/bin/ffmpeg -i $f;done 2>&1 | grep -e "bitrate" -e "ffmpeg_"
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp18.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 5534 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp19.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 4804 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp20.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 4107 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp21.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 3717 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp22.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 2997 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp23.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 2491 kb/s
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'ffmpeg_720p_qp24.mp4':
  Duration: 00:02:29.68, start: 0.000000, bitrate: 2225 kb/s
yano@haswell:~/qsv$

qp=23で"2491 kb/s"(45MB)、処理時間19秒ほどとなった。fpsで230超えって強烈だな。

参照

Qiita http://qiita.com/

大ちゃんのいろいろ雑記 https://www.taruki.com/

Web Net Force http://webnetforce.net/

hirooka.pro https://hirooka.pro/

Kung Noi Blog http://www.goodnai.com/

rigayaの日記兼メモ帳 http://rigaya34589.blog135.fc2.com/

犬アイコンのみっきー https://mzyy94.com/blog/

www.nodoka.org http://www.nodoka.org/

FFmpeg https://ffmpeg.org/

Intel Develper Zone https://software.intel.com/en-us

Wikipedia http://ja.wikipedia.org/wiki/