Linux (CentOS 7.2 1511) と FFmpeg で QSV (Quick Sync Video)

スポンサーリンク

最近,Intel Media Server Studio 2017 がリリースされたとのこと.第6世代 Core の Skylake がサポートされたとのことで試してみました.以前はカーネルをビルドしないといけなかったですが,今回のバージョンではインストールがずいぶんと楽になりました.

media_server_studio_essentials_release_notes.pdf
Intel Media Server Studio 2017 – Essentials Edition for Linux
Release Notes

System Requirements

Hardware
Intel® Media Server Studio supports the following platforms with the integrated graphics:
Intel Xeon E3-1200 v4 Family with C226 chipset
Intel Xeon E3-1200 and E3-1500 v5 Family with C236 chipset
5th Generation Intel Core
6th Generation Intel Core

Software
CentOS 7.2 (1511) of 64-bit architecture its default or latest kernels.
Generic OS install uses kernel 4.4.0 from www.kernel.org.

Intel Media Server Studio 2016 と Haswell と FFmpeg と QSV のときのポストはこちら.
Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video)
https://hirooka.pro/?p=8305

環境

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 の Community Edition をダウンロードします.

Intel Media Server Studio – Community Edition.
MediaServerStudioEssentials2017.tar.gz (320 MB)
Update 2017_R1
Date posted:19 Aug 2016
Build date:19 Aug 2016

2016-09-09 時点では下記のファイルが最新のものとしてダウンロードできました.
MediaServerStudioEssentials2017.tar.gz

CentOS 7.2 のインストール

下記のサイトからダウンロードします.Minimal でも DVD でも構いません.今回は DVD をダウンロードしてインストールしてみました.

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

上記の ISO で,GNOME Desktop としてインストールを行いました.

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

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

既にダウンロードしている MediaServerStudioEssentials2017.tar.gz を使用して,インストールスクリプトを実行します.2016 をインストールしたことがあるなら,そのあまりの楽さに驚きます.

tar zxvf MediaServerStudioEssentials2017.tar.gz
cd MediaServerStudioEssentials2017
tar zxvf SDK2017Production16.5.tar.gz 
cd SDK2017Production16.5
cd CentOS
tar zxvf install_scripts_centos_16.5-55964.tar.gz 
sudo ./install_sdk_CentOS.sh
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                 1321453  5 
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.55964-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 MediaServerStudioEssentials2017
tar zxvf MediaSamples_Linux_2017.tar.gz 
cd MediaSamples_Linux_2017/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.16053497

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

Session 0 was NOT joined with other sessions

Transcoding started
..
Transcoding finished

Common transcoding time is  0.17 sec 
MFX session 0 transcoding PASSED:
Processing time: 0.17 sec 
Number of processed frames: 101

The test PASSED

libmfx

libmfx の設定を行います.

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

FFmpeg

最新の FFmpeg で QSV を使用してエンコード,トランスコードを行ってみます.

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 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
    tar jxvf ffmpeg-snapshot.tar.bz2 && \
    cd ffmpeg && \
    ./configure --enable-libmfx && \
    make -j8 && \
    sudo make install && \
    sudo ldconfig

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

ffmpeg -version

結果,

ffmpeg version N-81539-gd2e7431 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
configuration: --enable-libmfx
libavutil      55. 29.100 / 55. 29.100
libavcodec     57. 54.102 / 57. 54.102
libavformat    57. 48.102 / 57. 48.102
libavdevice    57.  0.102 / 57.  0.102
libavfilter     6. 59.100 /  6. 59.100
libswscale      4.  1.100 /  4.  1.100
libswresample   2.  1.100 /  2.  1.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.44x ですよ,speed=8.44x

ffmpeg version N-81539-gd2e7431 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-4)
  configuration: --enable-libmfx
  libavutil      55. 29.100 / 55. 29.100
  libavcodec     57. 54.102 / 57. 54.102
  libavformat    57. 48.102 / 57. 48.102
  libavdevice    57.  0.102 / 57.  0.102
  libavfilter     6. 59.100 /  6. 59.100
  libswscale      4.  1.100 /  4.  1.100
  libswresample   2.  1.100 /  2.  1.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
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
[mp4 @ 0x36481c0] Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    Last message repeated 1 times
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.48.102
    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.54.102 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.54.102 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=   77 fps=0.0 q=-0.0 size=      59kB time=00:00:03.32 bitrate= 146.0kbits/frame=  168 fps=168 q=-0.0 size=     642kB time=00:00:07.10 bitrate= 740.9kbits/frame=  274 fps=182 q=-0.0 size=    1347kB time=00:00:11.54 bitrate= 956.2kbits/frame=  375 fps=187 q=-0.0 size=    1883kB time=00:00:15.76 bitrate= 978.3kbits/frame=  479 fps=191 q=-0.0 size=    2461kB time=00:00:20.07 bitrate=1004.3kbits/frame=  582 fps=193 q=-0.0 size=    3036kB time=00:00:24.36 bitrate=1020.9kbits/frame=  687 fps=195 q=-0.0 size=    3645kB time=00:00:28.73 bitrate=1039.1kbits/frame=  789 fps=196 q=-0.0 size=    4283kB time=00:00:33.00 bitrate=1063.1kbits/frame=  895 fps=198 q=-0.0 size=    4849kB time=00:00:37.37 bitrate=1062.7kbits/frame=  998 fps=199 q=-0.0 size=    5387kB time=00:00:41.72 bitrate=1057.7kbits/frame= 1116 fps=202 q=-0.0 size=    6084kB time=00:00:46.63 bitrate=1068.7kbits/frame= 1241 fps=206 q=-0.0 size=    6796kB time=00:00:51.84 bitrate=1074.0kbits/frame= 1253 fps=203 q=-0.0 Lsize=    6969kB time=00:00:52.12 bitrate=1095.2kbits/s speed=8.44x    
video:6119kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.478695%
[aac @ 0x3690460] Qavg: 658.895