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

スポンサーリンク
CentOS

2017-01-20 に Intel から NEW! Intel Media Server Studio 2017 R2 というタイトルのメールが来ていました。というわけでダウンロードして試してみました。

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

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.2 (1511) です。

環境

  • Intel Core i3-6100 (Skylake)
  • ASUS Z170I PRO GAMING
  • CentOS 7.2 1511

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

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

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

Intel Media Server Studio - Community Edition
2017 2017_R2
Build date: 26 Dec 2016
MediaServerStudioEssentials2017R2.tar.gz 364 MB

CentOS 7.2 のインストール

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

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

上記の ISO でのインストール時、Base Environment で Development and Creative Workstation を選択しました。

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

uname -a

結果、

Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

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

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

sudo usermod -a -G video $USER

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

lspci -nn -s 00:02.0

結果、

00:02.0 VGA compatible controller [0300]: Intel Corporation Sky Lake Integrated Graphics [8086:1912] (rev 06)

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

Intel Media Server Studio

既にダウンロードしている MediaServerStudioEssentials2017R2.tar.gz に含まれているインストールスクリプトを実行します.過去に 2016 をインストールしたことがあるなら、そのあまりの楽さに驚きます。

ただし、このままインストールスクリプトを実行すると下記のようなエラーとなります。

checking whether --releasever=7.2.1511 works for yum...
Loaded plugins: fastestmirror, langpacks
!!! CHECK FAILED !!!
NOTE:
This release for CentOS7.2 ONLY.
So for yum install of prerequisite packages, we need to use --releasever=7.2.1511 to limit to CentOS7.2 release.
One possible solution is editing /etc/yum.repos.d/CentOS-Base.repo, commenting out the mirrorlist lines and uncomment the baseurl lines for each entry
e.g.
====================================================================================================
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
====================================================================================================
After finishing the editing, please run this script again.

そのため、/etc/yum.repos.d/CentOS-Base.repo を編集します。

sudo sh -c "sed -i -e 's/mirrorlist=/#mirrorlist=/g' /etc/yum.repos.d/CentOS-Base.repo"
sudo sh -c "sed -i -e 's/#baseurl=http:\/\/mirror.centos.org\/centos/baseurl=http:\/\/vault.centos.org/g' /etc/yum.repos.d/CentOS-Base.repo"

その後、イントールスクリプトを実行します。

tar zxvf MediaServerStudioEssentials2017R2.tar.gz
cd MediaServerStudioEssentials2017R2
tar zxvf SDK2017Production16.5.1.tar.gz 
cd SDK2017Production16.5.1
cd CentOS
tar zxvf install_scripts_centos_16.5.1-59511.tar.gz
sudo ./install_sdk_CentOS.sh

インストールスクリプトは数分で完了します。完了後、/etc/yum.repos.d/CentOS-Base.repo を元に戻しておきます。

sudo sh -c "sed -i -e 's/#mirrorlist=/mirrorlist=/g' /etc/yum.repos.d/CentOS-Base.repo"
sudo sh -c "sed -i -e 's/baseurl=http:\/\/vault.centos.org/#baseurl=http:\/\/mirror.centos.org\/centos/g' /etc/yum.repos.d/CentOS-Base.repo"

OS を再起動します。

sudo reboot

再起動後、カーネルのバージョンを見てみます。

uname -a
Linux localhost.localdomain 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

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

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

lsmod で確認。

lsmod | grep 'i915'

結果、

i915                 1325693  4 
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       109279  1 i915
video                  24400  2 i915,asus_wmi
i2c_core               40582  7 drm,i915,i2c_i801,i2c_hid,i2c_algo_bit,drm_ukmd,drm_ukmd_kms_helper

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.1.59511-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 MediaServerStudioEssentials2017R2
tar zxvf MediaSamples_Linux_2017R2.tar.gz 
cd MediaSamples_Linux_2017R2_b634/samples/_bin/x64
./sample_multi_transcode -i::h264 ../content/test_stream.264 -o::h264 test_out.h264 -hw -la

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

Multi Transcoding Sample Version 7.0.16053634

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.21 parameters: 
Input  video: AVC 
Output video: AVC 

Session 0 was NOT joined with other sessions

Transcoding started
..
Transcoding finished

Common transcoding time is 0.185309 sec
-------------------------------------------------------------------------------
*** session 0 PASSED (MFX_ERR_NONE) 0.185145 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.1
Libs: -L${libdir} -lmfx -lva -lstdc++ -ldl -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm

FFmpeg

最新バージョンである FFmpeg 3.2.3 で QSV を使用してエンコード、トランスコードを行ってみます。

なお、スナップショットである https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 ではデフォルト設定では動作しませんでした。少なくとも JST 2017-02-09 時点のスナップショットでは。ワークアラウンドはありますが変換速度が著しく落ちました。

過去にポストしていた現象がまだ発生するようです。
h264_qsv – Selected ratecontrol mode is not supported by the QSV runtime. Choose a different mode.

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 -j8 && \
    sudo make install && \
    sudo ldconfig

cd /tmp && \
    wget http://ffmpeg.org/releases/ffmpeg-3.2.3.tar.bz2 && \
    tar jxvf ffmpeg-3.2.3.tar.bz2 && \
    cd ffmpeg-3.2.3 && \
    ./configure --enable-libmfx && \
    make -j8 && \
    sudo make install && \
    sudo ldconfig

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

ffmpeg -version

結果、

ffmpeg version 3.2.3 Copyright (c) 2000-2017 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
configuration: --enable-libmfx
libavutil      55. 34.101 / 55. 34.101
libavcodec     57. 64.101 / 57. 64.101
libavformat    57. 56.101 / 57. 56.101
libavdevice    57.  1.100 / 57.  1.100
libavfilter     6. 65.100 /  6. 65.100
libswscale      4.  2.100 /  4.  2.100
libswresample   2.  3.100 /  2.  3.100

何かビデオファイルをトランスコードしてみます。

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

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

ffmpeg version 3.2.3 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
  configuration: --enable-libmfx
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
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
File 'out_qsv.mp4' already exists. Overwrite ? [y/N] y
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
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.56.101
    Stream #0:0(und): Video: h264 (h264_qsv) ([33][0][0][0] / 0x0021), 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.64.101 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) ([64][0][0][0] / 0x0040), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : SoundHandler
      encoder         : Lavc57.64.101 aac
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
frame=   83 fps=0.0 q=-0.0 size=      89kB time=00:00:03.56 bitrate= 205.5kbits/frame=  176 fps=175 q=-0.0 size=     680kB time=00:00:07.44 bitrate= 747.8kbits/frame=  286 fps=189 q=-0.0 size=    1378kB time=00:00:12.03 bitrate= 938.5kbits/frame=  390 fps=194 q=-0.0 size=    2000kB time=00:00:16.36 bitrate=1001.1kbits/frame=  493 fps=196 q=-0.0 size=    2538kB time=00:00:20.65 bitrate=1006.9kbits/frame=  594 fps=197 q=-0.0 size=    3103kB time=00:00:24.87 bitrate=1022.0kbits/frame=  701 fps=199 q=-0.0 size=    3746kB time=00:00:29.31 bitrate=1047.0kbits/frame=  805 fps=200 q=-0.0 size=    4387kB time=00:00:33.66 bitrate=1067.5kbits/frame=  910 fps=201 q=-0.0 size=    4932kB time=00:00:38.03 bitrate=1062.1kbits/frame= 1017 fps=202 q=-0.0 size=    5515kB time=00:00:42.49 bitrate=1063.2kbits/frame= 1137 fps=206 q=-0.0 size=    6188kB time=00:00:47.48 bitrate=1067.5kbits/frame= 1253 fps=206 q=-0.0 Lsize=    6969kB time=00:00:52.12 bitrate=1095.2kbits/s speed=8.55x    
video:6119kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.478695%
[aac @ 0x39589e0] Qavg: 658.896

こちらも参考に。

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