Intel Media Server Studio 2017 R3 と FFmpegと Linux (CentOS 7.3 1611) で QSV (Quick Sync Video)

スポンサーリンク

なにやらしれっと Intel Media Server Studio 2017 R3 がリリースされていました。前のバージョン R2 から実に7ヶ月ぶりです。

Announcing Intel Media Server Studio 2017 R3 and New Sample Code
https://software.intel.com/en-us/forums/intel-media-sdk/topic/740685

Deliver Fast, Brilliant Video Experiences with New Intel Media Server Studio 2017 R3
https://software.intel.com/en-us/blogs/2017/07/11/whats-new-in-intel-media-server-studio-2017-r3

Intel Media Server Studio 2017
https://software.intel.com/en-us/intel-media-server-studio

というわけでダウンロードして h264_sqv と hevc_qsv を試してみました。HLS も HEVC サポートするとのことなので、今回から h264_qsv だけではなく hevc_qsv も試してみます。

なお、過去のバージョン時のポストは下記に。

Intel Media Server Studio 2017 R2 と Skylake
Intel Media Server Studio 2017 R2 と FFmpeg 3.2.3 と Linux (CentOS 7.2 1511) で QSV (Quick Sync Video)

Intel Media Server Studio 2017 R1 と Skylake
Linux (CentOS 7.2 1511) と FFmpeg で QSV (Quick Sync Video)

Intel Media Server Studio 2016 と Haswell
Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video)

で、リリースノートを読むと、サポートするハードウェア要件は一つ前のバージョンから変わりはありませんでした。Core シリーズについては第5世代と第6世代のみです。Broadwell と Skylake ですね。ソフトウェア要件は変化がありました。CentOS 7.3 (1611) が前提になっています。あと、インストールスクリプトも改善されてますね。

環境

試した環境。

  • Intel Core i3-6100 (Skylake)
  • ASUS Z170I PRO GAMING
  • CentOS 7.3 1611

Intel Media Server Studio for Linux のダウンロード

Intel Developer Zone
https://software.intel.com/en-us/intel-media-server-studio

ユーザー登録を行い,Intel Media Server Studio 2017 R3 の Community Edition をダウンロードします.

Intel Media Server Studio - Community Edition
2017 2017_R3
Build date: 14 Jun 2017
MediaServerStudioEssentials2017R3.tar.gz 364 MB

CentOS 7.3 のインストール

下記のサイトからダウンロードします。CentOS-7-x86_64-DVD-1611.iso をダウンロードしました。

http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso

上記の ISO でのインストール時、Base Environment で GNOME Desktop を選択しました。

インストール後、カーネルのバージョンを確認してみます。

uname -a

結果、

Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

CentOS 7.3 インストール後の設定と確認

任意のユーザーを video グループに追加しておく必要があります。

sudo usermod -a -G video $USER

lspci でグラフィックコントローラを確認してみます。

lspci -nn -s 00:02.0

結果、

00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 530 [8086:1912] (rev 06)

きちんと第6世代 Core Skylake として認識されているようです。

Intel Media Server Studio

既にダウンロードしている MediaServerStudioEssentials2017R3.tar.gz に含まれているインストールスクリプトを実行します。

tar zxvf MediaServerStudioEssentials2017R3.tar.gz
cd MediaServerStudioEssentials2017R3
tar zxvf SDK2017Production16.5.2.tar.gz 
cd SDK2017Production16.5.2
cd CentOS
tar zxvf install_scripts_centos_16.5.2-64009.tar.gz
sudo ./install_sdk_CentOS.sh

install_sdk_CentOS.sh を実行すると下記のようなメッセージが表示されますが、1 を選択する、でよいかと思います。

If CentOS latest release version is newer than 7.3.1611, yum will default to install packages from this repository.
This could lead to packages been installed that could conflict with this version of MediaServerStudio and cause installation to fail.
It is ultimate responsibility of user to manage yum repositories to ensure that packages installed during installation of MediaServerStudio using yum package manger are installed from correct repository.
For more information on CentOS version please see: "https://wiki.centos.org/FAQ/General#head-dcca41e9a3d5ac4c6d900a991990fd11930867d6"


User has 3 options to proceed with installation:
1: (default) Installation Script will automatically attempt to enable correct repositories to install from.
2: User can manually edit yum repository files to ensure yum installs from correct repository, i.e. "--releasever=7.3.1611" is workable.
   If this option is chosen installation will abort then user need to fix yum repository files and run this script again.
3: Force installation from default yum repository, i.e. using "--releasever=7" yum option (ONLY for advanced users who clearly know what will happen)

If no response in 120 seconds option 1 will be default [1]

インストールスクリプトは数分で完了します。

OS を再起動します。

sudo reboot

再起動後、カーネルのバージョンを見てみます。変わってないですね。

uname -a
Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

きちんとディレクトリが作成されているか確認してみます。

ls /opt/intel/mediasdk/
doc  include  lib  lib64  opensource  plugins  tools

lsmod で確認。

lsmod | grep 'i915'

結果、

i915                 1326432  6 
i2c_algo_bit           13413  1 i915
drm_ukmd_kms_helper   141060  1 i915
drm_ukmd              369649  3 i915,drm_ukmd_kms_helper
drm_ukmd_compat       109059  1 i915
video                  24400  2 i915,asus_wmi
i2c_core               40756  8 drm,i915,i2c_i801,i2c_hid,i2c_algo_bit,drm_ukmd,drm_ukmd_kms_helper,videodev

vainfo を実行し、エラーがないことを確認します。

vainfo | grep -v 'unknown'
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.99 (libva 1.67.0.pre1)
vainfo: Driver version: 16.5.2.64009-ubit
vainfo: Supported profile and entrypoints
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSlice
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSlice
      VAProfileMPEG2Simple            :	VAEntrypointEncSlice
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointEncSlice
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD
      VAProfileVC1Main                :	VAEntrypointVLD
      VAProfileVC1Simple              :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointEncPicture
      VAProfileVP8Version0_3          :	VAEntrypointEncSlice
      VAProfileVP8Version0_3          :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointEncSlice
      VAProfileNone                   :	VAEntrypointVideoProc

次に、サンプルプログラムを実行してみます。

cd MediaServerStudioEssentials2017R3
tar zxvf MediaSamples_Linux_2017R3.tar.gz
cd MediaSamples_Linux_2017R3_b698/samples/_bin/x64
./sample_multi_transcode -i::h264 ../content/test_stream.264 -o::h264 test_out.h264 -hw -la

PASS することを確認します。

Multi Transcoding Sample Version 8.0.24.698

libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
Pipeline surfaces number (DecPool): 59
MFX HARDWARE Session 0 API ver 1.23 parameters: 
Input  video: AVC 
Output video: AVC 

Session 0 was NOT joined with other sessions

Transcoding started
..
Transcoding finished

Common transcoding time is 0.089915 sec
-------------------------------------------------------------------------------
*** session 0 PASSED (MFX_ERR_NONE) 0.0898 sec, 101 frames
-i::h264 ../content/test_stream.264 -o::h264 test_out.h264 -hw -la 

-------------------------------------------------------------------------------

The test PASSED

libmfx

libmfx の設定を行います。下記の Intel の情報そのまんまです。

Accessing Intel® Media Server Studio for Linux* codecs with FFmpeg
https://software.intel.com/en-us/articles/accessing-intel-media-server-studio-for-linux-codecs-with-ffmpeg

sudo mkdir /opt/intel/mediasdk/include/mfx
sudo cp /opt/intel/mediasdk/include/*.h /opt/intel/mediasdk/include/mfx

pc ファイルを作成します。

sudo vi /usr/lib64/pkgconfig/libmfx.pc

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.2
Libs: -L${libdir} -lmfx -lva -lstdc++ -ldl -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm

FFmpeg

FFmpeg の Snapshot (2017-08-11 JST のもの) を使用してみます。半年前にハマった look_ahead 問題も解決してるっぽいです。

cd /tmp && \
    wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz && \
    tar zxvf yasm-1.3.0.tar.gz && \
    cd yasm-1.3.0 && \
    ./configure && \
    make -j$(nproc) && \
    sudo make install && \
    sudo ldconfig

cd /tmp && \
    wget http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
    tar jxvf ffmpeg-snapshot.tar.bz2 && \
    cd ffmpeg && \
    ./configure --enable-libmfx && \
    make -j$(nproc) && \
    sudo make install

バージョンを確認してみます。

ffmpeg -version

結果、

ffmpeg version N-86964-gf357104 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)
configuration: --enable-libmfx
libavutil      55. 73.100 / 55. 73.100
libavcodec     57.102.100 / 57.102.100
libavformat    57. 76.100 / 57. 76.100
libavdevice    57.  7.100 / 57.  7.100
libavfilter     6. 98.100 /  6. 98.100
libswscale      4.  7.102 /  4.  7.102
libswresample   2.  8.100 /  2.  8.100

まず h264_qsv で何かビデオファイルをトランスコードしてみます。オプション -init_hw_device qsv:hw を付けないと動きませんでした。

wget https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
ffmpeg -i sintel_trailer-1080p.mp4 -vcodec h264_qsv -init_hw_device qsv:hw out_qsv.mp4

FFmpeg のログです。H.264 (h264_qsv) となっているのがわかります。しかも speed=8.92x ですよ、speed=8.92x

ffmpeg version N-86964-gf357104 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)
  configuration: --enable-libmfx
  libavutil      55. 73.100 / 55. 73.100
  libavcodec     57.102.100 / 57.102.100
  libavformat    57. 76.100 / 57. 76.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 98.100 /  6. 98.100
  libswscale      4.  7.102 /  4.  7.102
  libswresample   2.  8.100 /  2.  8.100
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sintel_trailer-1080p.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01T00:00:00.000000Z
    title           : Sintel Trailer
    artist          : Durian Open Movie Team
    encoder         : Lavf52.62.0
    copyright       : (c) copyright Blender Foundation | durian.blender.org
    description     : Trailer for the Sintel open movie project
  Duration: 00:00:52.21, start: 0.000000, bitrate: 2240 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2108 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_qsv))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, mp4, to 'out_qsv.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    description     : Trailer for the Sintel open movie project
    title           : Sintel Trailer
    artist          : Durian Open Movie Team
    copyright       : (c) copyright Blender Foundation | durian.blender.org
    encoder         : Lavf57.76.100
    Stream #0:0(und): Video: h264 (h264_qsv) (avc1 / 0x31637661), nv12, 1920x1080, q=2-31, 1000 kb/s, 24 fps, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
      encoder         : Lavc57.102.100 h264_qsv
    Side data:
      cpb: bitrate max/min/avg: 0/0/1000000 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
      encoder         : Lavc57.102.100 aac
frame= 1253 fps=214 q=-0.0 Lsize=    6969kB time=00:00:52.12 bitrate=1095.3kbits/s speed=8.92x    
video:6119kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.479437%
[aac @ 0x35ed880] Qavg: 660.242

次に hevc_qsv で何かビデオファイルをトランスコードしてみます。オプション -init_hw_device qsv:hw と -load_plugin hevc_hw、さらに maxrate を付けないと動きませんでした。

wget https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
ffmpeg -i sintel_trailer-1080p.mp4 -vcodec hevc_qsv -init_hw_device qsv:hw -load_plugin hevc_hw -maxrate 10000k out_qsv.mp4

FFmpeg のログです。HEVC、H.265 (hevc_qsv) となっているのがわかります。こちらは speed=2.95x でした。h264_qsv よりは遅いですが実時間よりは高速ですね。よって、リアルタイムのトランスコードが可能です。

ffmpeg version N-86964-gf357104 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11)
  configuration: --enable-libmfx
  libavutil      55. 73.100 / 55. 73.100
  libavcodec     57.102.100 / 57.102.100
  libavformat    57. 76.100 / 57. 76.100
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 98.100 /  6. 98.100
  libswscale      4.  7.102 /  4.  7.102
  libswresample   2.  8.100 /  2.  8.100
libva info: VA-API version 0.99.0
libva info: va_getDriverName() returns 0
libva info: User requested driver 'iHD'
libva info: Trying to open /opt/intel/mediasdk/lib64/iHD_drv_video.so
libva info: Found init function __vaDriverInit_0_32
libva info: va_openDriver() returns 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'sintel_trailer-1080p.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01T00:00:00.000000Z
    title           : Sintel Trailer
    artist          : Durian Open Movie Team
    encoder         : Lavf52.62.0
    copyright       : (c) copyright Blender Foundation | durian.blender.org
    description     : Trailer for the Sintel open movie project
  Duration: 00:00:52.21, start: 0.000000, bitrate: 2240 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080, 2108 kb/s, 24 fps, 24 tbr, 24 tbn, 48 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 126 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_qsv))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
Output #0, mp4, to 'out_qsv.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    description     : Trailer for the Sintel open movie project
    title           : Sintel Trailer
    artist          : Durian Open Movie Team
    copyright       : (c) copyright Blender Foundation | durian.blender.org
    encoder         : Lavf57.76.100
    Stream #0:0(und): Video: hevc (hevc_qsv) (hev1 / 0x31766568), nv12, 1920x1080, q=2-31, 1000 kb/s, 24 fps, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
      encoder         : Lavc57.102.100 hevc_qsv
    Side data:
      cpb: bitrate max/min/avg: 10000000/0/1000000 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
      encoder         : Lavc57.102.100 aac
frame= 1253 fps= 71 q=-0.0 Lsize=    4828kB time=00:00:52.00 bitrate= 760.6kbits/s speed=2.95x    
video:3973kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.798136%
[aac @ 0x3dbb580] Qavg: 660.242

少し謎なのは、Intel Quick Sync Video and FFmpeg Installation and Validation を読むと “Professional edition install is required for hevc_qsv” と書かれているのですが、無料の Community Edition でも /opt/intel/mediasdk/plugins/plugins.cfg を見ると HEVC プラグインあるんですよね。

[HEVC_Encoder_6fadc791a0c2eb479ab6dcd5ea9da347]
GUID = 6fadc791a0c2eb479ab6dcd5ea9da347
PluginVersion = 1
APIVersion = 279
Path = /opt/intel/mediasdk/plugins/libmfx_hevce_hw64.so
Type = 2
CodecID = HEVC
Default = 0

参考情報

Intel Quick Sync Video and FFmpeg Installation and Validation
http://www.intel.co.jp/content/www/jp/ja/cloud-computing/quicksync-video-ffmpeg-install-valid.html

Accessing Intel® Media Server Studio for Linux* codecs with FFmpeg
https://software.intel.com/en-us/articles/accessing-intel-media-server-studio-for-linux-codecs-with-ffmpeg

メモ

maxrate オプションを付けないと下記のエラー。

[hevc_qsv @ 0x20a3940] Selected ratecontrol mode is not supported by the QSV runtime. Choose a different mode.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

-load_plugin hevc_hw を付けないと下記のエラー。

[hevc_qsv @ 0x2feb8c0] Could not load the requested plugin '2fca99749fdb49aeb121a5b63ef568f7': specified object was not found (-9)
[hevc_qsv @ 0x2feb8c0] Error loading plugins
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height

-init_hw_device qsv:hw を付けないと下記のエラー。

[hevc_qsv @ 0x3ebe4a0] No device available for encoder (device type qsv for codec hevc_qsv).
[hevc_qsv @ 0x3ebe4a0] Selected ratecontrol mode is not supported by the QSV runtime. Choose a different mode.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height