広告

Intel Media Server Studio 2018 R1 と FFmpegと Linux (CentOS 7.4 1708) で QSV (Quick Sync Video)

4 月上旬に Intel Media Server Studio 2018 R1 がリリースされていたようです。前のバージョン 2017 R3 から実に9ヶ月振りくらいです。

What’s New in Intel Media Server Studio 2018
https://software.intel.com/en-us/blogs/2018/03/07/whats-new-in-intel-media-server-studio-2018-r1

というわけで今回も H.264、HEVC/H.265 への変換を行うべく、h264_sqv と hevc_qsv を試してみました。

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

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

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

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

Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video)

リリースノートを読むと、Core シリーズは第5世代と第6世代のみをサポートしています。Broadwell と Skylake ですね。Linux で検証されているのは CentOS 7.4 (1708) とのことです。

自身の環境

  • Intel Core i3-6100 (Skylake)
  • ASUS Z170I PRO GAMING
  • CentOS 7.4 1708

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

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

ユーザー登録を行い、Intel Media Server Studio 2018 R1 の Community Edition をダウンロードします。

Intel Media Server Studio - Community Edition
2018 2018_R1
Build date: 15 Mar 2018
MediaServerStudioEssentials2018R1.tar.gz 549 MB

CentOS 7.4 のインストール

CentOS のサイトで CentOS-7-x86_64-DVD-1708.iso をダウンロードしました。インストール時、Base Environment で GNOME Desktop を選択しました。

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

uname -a

結果、

Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

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

任意のユーザーを 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

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

tar zxvf MediaServerStudioEssentials2018R1.tar.gz
cd MediaServerStudioEssentials2018R1
tar zxvf SDK2018Production16.8.tar.gz
SDK2018Production16.8
cd CentOS_7.4
tar zxvf install_scripts_centos_16.8-69021.tar.gz
sudo ./install_sdk_CentOS.sh

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

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.4.1708" 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-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

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

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

lsmod で確認。

lsmod | grep 'i915'

結果、

i915                 1328806  14 
i2c_algo_bit           13413  1 i915
drm_ukmd_kms_helper   141366  1 i915
drm_ukmd_compat       122928  2 i915,drm_ukmd_kms_helper
drm_ukmd              369737  3 i915,drm_ukmd_kms_helper
video                  24520  2 i915,asus_wmi
i2c_core               40756  7 drm,i915,i2c_i801,i2c_hid,i2c_algo_bit,drm_ukmd,drm_ukmd_kms_helper

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

cd MediaServerStudioEssentials2018R1
tar zxvf MediaSamples_Linux_2018R1_b982.tar.gz
cd MediaSamples_Linux_2018R1_b982/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.2.25.982

libva info: VA-API version 1.0.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_1_0
libva info: va_openDriver() returns 0
Pipeline surfaces number (DecPool): 59
MFX HARDWARE Session 0 API ver 1.25 parameters: 
Input  video: AVC 
Output video: AVC 

Session 0 was NOT joined with other sessions

Transcoding started
..
Transcoding finished

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

FFmpeg

FFmpeg 3.4.2 “Cantor” を使用してみます。

2018-04-29 JST 時点では、FFmpeg Snapshot 版、4.0 “Wu” で

ffmpeg -i input.mp4 -vcodec h264_qsv -init_hw_device qsv:hw output.mp4

を実行しようとすると、下記のようなエラーとなってしまいました。

[h264_qsv @ 0x2ff7940] Encoder will work with partial HW acceleration
[h264_qsv @ 0x2ff7940] Error initializing the encoder: invalid video parameters (-15)
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

Yasm をインストールした後に FFmpeg をインストールします。

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-3.4.2.tar.bz2 && \
    tar jxvf ffmpeg-3.4.2.tar.bz2 && \
    cd ffmpeg-3.4.2 && \
    ./configure --enable-libmfx && \
    make -j$(nproc) && \
    sudo make install

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

ffmpeg -version

結果、

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
configuration: --enable-libmfx
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.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.26x でした。30分のビデオなら4分程度で変換できます。

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
  configuration: --enable-libmfx
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.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
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.83.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.107.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.107.100 aac
...
frame= 1253 fps=199 q=-0.0 Lsize=    6969kB time=00:00:52.12 bitrate=1095.3kbits/s speed=8.26x    
video:6119kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.479437%
[aac @ 0x3b34fe0] 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_hevc.mp4

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

ffmpeg version 3.4.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
  configuration: --enable-libmfx
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.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
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_hevc.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.83.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.107.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.107.100 aac
frame= 1253 fps= 71 q=-0.0 Lsize=    5612kB time=00:00:52.00 bitrate= 884.1kbits/s speed=2.96x    
video:4757kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.685889%
[aac @ 0x24dfce0] Qavg: 660.242

なお、/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

広告