YANO's digital garage

Copyright ©YANO All rights reserved. https://www.bravotouring.com/~yano/

Last-modified: 2021-10-06 (水)


[一語一絵/IT系]

UbuntuとQSV / 2017-01-12 (木)

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

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

[External]Intel® Media Server StudioではなくVAAPI経由でffmpegから気軽にQSVを使えるレポートが[External]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。 続いて[External]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程度。[External]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/
QSV 対応 Intel CPU で H.264 のハードウェアエンコード on Linux 2016/09/25
●大ちゃんのいろいろ雑記 https://www.taruki.com/
ffmpegでIntelのGPUをVA-APIを使ってh264エンコードしたメモ 2016/10/11
●Web Net Force http://webnetforce.net/
Ubuntuでtsからmp4へ変換する設定 (2016年版) 2016/12/19
UbuntuでQSVを利用したエンコードでtsをmp4に爆速変換 2016/12/19
●hirooka.pro https://hirooka.pro/
Linux で QSV を試すためだけに第 4 世代 Core を購入した件 2016/04/10
Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video) 2016/04/12
Linux (CentOS 7.2 1511) と FFmpeg で QSV (Quick Sync Video) 2016/09/09
●Kung Noi Blog http://www.goodnai.com/
LinuxでIntel QSVを使ったH.264ハードウェアエンコード(CentOS7+ffmpeg) 2015/11/24
●rigayaの日記兼メモ帳 http://rigaya34589.blog135.fc2.com/
DebianにIntel Media SDK Serverをインストール 2015/11/03
●犬アイコンのみっきー https://mzyy94.com/blog/
KVMでQSVするためIntel HD Graphicsパススルーするー 2014/12/12
Intel QSVのH.264エンコードをLinuxで! 2015/01/30
クリスマスなのでLinuxでQSVエンコードする 2015/12/21
●www.nodoka.org http://www.nodoka.org/
録画サーバ構築 QSVエンコード Linux編 2016/05/27
録画サーバ構築 QSVエンコード Skylake+Linux編 2016/10/27
●FFmpeg https://ffmpeg.org/
CompilationGuide/Ubuntu
●Intel Develper Zone https://software.intel.com/en-us
Intel® Media Server Studio
●Wikipedia http://ja.wikipedia.org/wiki/
LGA1150
Haswellマイクロアーキテクチャ
Broadwellマイクロアーキテクチャ
LGA1151
Skylakeマイクロアーキテクチャ