吉方位確認サービス「楽方位」α版を公開しました。

Intel Media Server Studio – Professional Edition 2018 R2 と FFmpeg 4.1 と Linux (CentOS 7.4 1708) で QSV (Quick Sync Video)

Sponsored Links

はじめに

2018 年 6 月 2 日の時点で、Intel Media Server Studio for Linux でダウンロード可能なエディションは Professional Edition のみになっていました。いつの間にか Community Edition が無くなっていました。

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

2016 年 4 月12 日に初めて Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video) を確認した投稿を行いました。その時は、Linux と FFmpeg で QSV をやりたいがためだけに Haswell の Core i3 を購入しました。

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

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

私の環境

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

参考公式 (Intel, FFmpeg) 情報

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

FFmpeg wiki: Hardware QuickSync

https://trac.ffmpeg.org/wiki/Hardware/QuickSync

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

Intel Developer Zone – Intel Media Server Studio 2018 for Linux

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

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

Intel Media Server Studio – Professional Edition
2018 2018_R2
Build date:27 Feb 2019
MediaServerStudioProfessional2018R2.tar.gz 1556 MB

CentOS 7.4 のインストール

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

http://vault.centos.org/7.4.1708/isos/x86_64/

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

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 のバージョンも確認してみます。

$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

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

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

tar zxvf MediaServerStudioProfessional2018R2.tar.gz
cd MediaServerStudioProfessional2018R2
tar zxvf SDK2018Production16.9.tar.gz
cd SDK2018Production16.9
cd centos
tar zxvf install_scripts_centos_16.9-00005.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]

インストールスクリプトは 15 分程度で完了しました。インターネットからのファイルのダウンロード速度にも依存します。

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

vainfo を確認してみます。

$ vainfo
error: can't connect to X server!
libva info: VA-API version 1.1.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_1
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.1 (libva 2.1.1.pre1)
vainfo: Driver version: Intel iHD driver - 16.9.00005
vainfo: Supported profile and entrypoints
      VAProfileNone                   :	VAEntrypointVideoProc
      VAProfileNone                   :	VAEntrypointStats
      VAProfileMPEG2Simple            :	VAEntrypointVLD
      VAProfileMPEG2Simple            :	VAEntrypointEncSlice
      VAProfileMPEG2Main              :	VAEntrypointVLD
      VAProfileMPEG2Main              :	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointVLD
      VAProfileH264Main               :	VAEntrypointEncSlice
      VAProfileH264Main               :	VAEntrypointFEI
      VAProfileH264Main               :	VAEntrypointEncSliceLP
      VAProfileH264High               :	VAEntrypointVLD
      VAProfileH264High               :	VAEntrypointEncSlice
      VAProfileH264High               :	VAEntrypointFEI
      VAProfileH264High               :	VAEntrypointEncSliceLP
      VAProfileVC1Simple              :	VAEntrypointVLD
      VAProfileVC1Main                :	VAEntrypointVLD
      VAProfileVC1Advanced            :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointVLD
      VAProfileJPEGBaseline           :	VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline:	VAEntrypointVLD
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline:	VAEntrypointFEI
      VAProfileH264ConstrainedBaseline:	VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointVLD
      VAProfileHEVCMain               :	VAEntrypointEncSlice
      VAProfileHEVCMain               :	VAEntrypointFEI

lsmod で確認してみます。

lsmod | grep 'i915'

結果、

i915                 1433649  9 
i2c_algo_bit           13413  1 i915
drm_ukmd_kms_helper   181499  1 i915
drm_ukmd              406311  3 i915,drm_ukmd_kms_helper
drm_ukmd_compat        73217  2 i915,drm_ukmd
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 MediaServerStudioProfessional2018R2
tar zxvf MediaSamples_Linux_2018R2.tar.gz
cd MediaSamples_Linux_2018R2/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.3.26.5

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

Session 0 was NOT joined with other sessions

Transcoding started
.
Transcoding finished

Common transcoding time is 0.082861 sec
-------------------------------------------------------------------------------
*** session 0 [0x55ed9b6b] PASSED (MFX_ERR_NONE) 0.082766 sec, 143 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.9
Libs: -L${libdir} -lmfx -lva -lstdc++ -ldl -lva-drm -ldrm
Cflags: -I${includedir} -I/usr/include/libdrm

FFmpeg (h264_qsv)

QSV で H.264 の動画を作成します。

FFmpeg で、2019-06-02 時点で最新の FFmpeg 4.1.3 “al-Khwarizmi” を使用してみます。

ビルドに必要なパッケージをインストールし、Yasm をインストールした後に FFmpeg をインストールします。

sudo yum -y install binutils libdrm-devel

cd ~/ && \
    curl -O 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 ~/ && \
    curl -O http://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2 && \
    tar jxvf ffmpeg-4.1.3.tar.bz2 && \
    cd ffmpeg-4.1.3 && \
    ./configure --enable-libmfx && \
    make -j$(nproc) && \
    sudo make install

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

ffmpeg -version

結果、

ffmpeg version 4.1.3 Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
configuration: --enable-libmfx
libavutil      56. 22.100 / 56. 22.100
libavcodec     58. 35.100 / 58. 35.100
libavformat    58. 20.100 / 58. 20.100
libavdevice    58.  5.100 / 58.  5.100
libavfilter     7. 40.101 /  7. 40.101
libswscale      5.  3.100 /  5.  3.100
libswresample   3.  3.100 /  3.  3.100

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

cd
curl -O https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
ffmpeg -init_hw_device qsv=hw \
  -filter_hw_device hw \
  -i sintel_trailer-1080p.mp4 \
  -vf hwupload=extra_hw_frames=64,format=qsv \
  -c:v h264_qsv \
  -b:v 5M \
  -maxrate 5M \
  -y output_h264_qsv.mp4

FFmpeg のログです。H.264 (h264_qsv) となっているのがわかります。speed=8.49x でした。30 分のビデオなら 3 分半程度で変換できます。

...

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_qsv))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))

...

frame= 1253 fps=204 q=26.0 Lsize=   32083kB time=00:00:52.12 bitrate=5042.2kbits/s speed=8.49x 

FFmpeg (hevc_qsv)

QSV で H.265/HEVC の動画を作成します。

しかし、私の環境では、FFmpeg Snapshot, FFmpeg 4.1.3, FFmpeg 4.0.4 ではエラーが発生し、トランスコードできませんでした。

ソースコードを少し見てみると、FFmpeg 4 系と FFmpeg 3 系では libavutil/hwcontext 周りに結構変更が入っているようで、エラーを解決することができませんでした。後述しますが、結局私の環境では FFmpeg 3.4 系まで遡らないと hevc_qsv でトランスコードできませんでした。

FFmpeg 3.4.6

結果として、私の環境では FFmpeg 3.4 系まで遡らないと hevc_qsv でトランスコードできませんでした。2019-06-02 時点で 3.4 系で最新の FFmpeg 3.4.6 を使用してみます。

h264_qsv を使用するためにインストールしている FFmpeg 4.1.3 と共存させるために、FFmpeg 3.4.6 はインストールするディレクトリを /usr/local/ffmpeg-3.4.6 のように指定しています。

cd ~/ && \
    curl -O http://ffmpeg.org/releases/ffmpeg-3.4.6.tar.bz2 && \
    tar jxvf ffmpeg-3.4.6.tar.bz2 && \
    cd ffmpeg-3.4.6 && \
    ./configure --enable-libmfx --prefix=/usr/local/ffmpeg-3.4.6 && \
    make -j$(nproc) && \
    sudo make install

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

/usr/local/ffmpeg-3.4.6/bin/ffmpeg -init_hw_device qsv=hw \
  -i sintel_trailer-1080p.mp4 \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4

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

...

Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> hevc (hevc_qsv))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
...

frame= 1253 fps= 69 q=-0.0 Lsize=   32103kB time=00:00:52.00 bitrate=5057.5kbits/s speed=2.86x

FFmpeg Snapshot

cd ~/ && \
    curl -O http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && \
    tar jxvf ffmpeg-4.1.3.tar.bz2 && \
    cd ffmpeg-4.1.3 && \
    ./configure --enable-libmfx --prefix=/usr/local/ffmpeg-snapshot && \
    make -j$(nproc) && \
    sudo make install
/usr/local/ffmpeg-snapshot/bin/ffmpeg -init_hw_device qsv=hw \
  -i sintel_trailer-1080p.mp4 \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[hevc_qsv @ 0x3436080] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x3436080] Low power mode is unsupported
[hevc_qsv @ 0x3436080] Current frame rate is unsupported
[hevc_qsv @ 0x3436080] Current picture structure is unsupported
[hevc_qsv @ 0x3436080] Current resolution is unsupported
[hevc_qsv @ 0x3436080] Current pixel format is unsupported
[hevc_qsv @ 0x3436080] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
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
[aac @ 0x3432900] Qavg: 55952.926
[aac @ 0x3432900] 2 frames left in the queue on closing
Conversion failed!
/usr/local/ffmpeg-snapshot/bin/ffmpeg -init_hw_device qsv=hw \
  -filter_hw_device hw \
  -i sintel_trailer-1080p.mp4 \
  -vf hwupload=extra_hw_frames=64,format=qsv \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[AVHWFramesContext @ 0x27ac500] Unsupported format: pal8.
[AVHWFramesContext @ 0x27e6dc0] Error initializing a child frames context
[AVHWFramesContext @ 0x27e6dc0] Error creating an internal frame pool
[hevc_qsv @ 0x21590c0] Error initializing a frames context for an internal frame allocation request

FFmpeg 4.1.3

前述の h264_qsv を試した FFmpeg を使用します。

ffmpeg -init_hw_device qsv=hw \
  -i sintel_trailer-1080p.mp4 \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[hevc_qsv @ 0x293db00] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x293db00] Current frame rate is unsupported
[hevc_qsv @ 0x293db00] Current picture structure is unsupported
[hevc_qsv @ 0x293db00] Current resolution is unsupported
[hevc_qsv @ 0x293db00] Current pixel format is unsupported
[hevc_qsv @ 0x293db00] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
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
[aac @ 0x296a380] Qavg: 55952.926
[aac @ 0x296a380] 2 frames left in the queue on closing
Conversion failed!
ffmpeg -init_hw_device qsv=hw \
  -filter_hw_device hw \
  -i sintel_trailer-1080p.mp4 \
  -vf hwupload=extra_hw_frames=64,format=qsv \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[AVHWFramesContext @ 0x3524bc0] Unsupported format: pal8.
[AVHWFramesContext @ 0x352ae80] Error initializing a child frames context
[AVHWFramesContext @ 0x352ae80] Error creating an internal frame pool
[hevc_qsv @ 0x2e62b40] Error initializing a frames context for an internal frame allocation request

FFmpeg 4.0.4

cd ~/ && \
    curl -O http://ffmpeg.org/releases/ffmpeg-4.0.4.tar.bz2 && \
    tar jxvf ffmpeg-4.0.4.tar.bz2 && \
    cd ffmpeg-4.0.4 && \
    ./configure --enable-libmfx --prefix=/usr/local/ffmpeg-4.0.4 && \
    make -j$(nproc) && \
    sudo make install
/usr/local/ffmpeg-4.0.4/bin/ffmpeg -init_hw_device qsv=hw \
  -i sintel_trailer-1080p.mp4 \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[hevc_qsv @ 0x3acf500] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x3acf500] Current frame rate is unsupported
[hevc_qsv @ 0x3acf500] Current picture structure is unsupported
[hevc_qsv @ 0x3acf500] Current resolution is unsupported
[hevc_qsv @ 0x3acf500] Current pixel format is unsupported
[hevc_qsv @ 0x3acf500] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
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
[aac @ 0x3ad16c0] Qavg: 55952.926
[aac @ 0x3ad16c0] 2 frames left in the queue on closing
Conversion failed!
/usr/local/ffmpeg-4.0.4/bin/ffmpeg -init_hw_device qsv=hw \
  -filter_hw_device hw \
  -i sintel_trailer-1080p.mp4 \
  -vf hwupload=extra_hw_frames=64,format=qsv \
  -c:v hevc_qsv \
  -load_plugin hevc_hw \
  -b:v 5M \
  -maxrate 5M \
  -y output_hevc_qsv.mp4
[AVHWFramesContext @ 0x532d040] Unsupported format: pal8.
[AVHWFramesContext @ 0x4993a40] Error initializing a child frames context
[AVHWFramesContext @ 0x4993a40] Error creating an internal frame pool
[hevc_qsv @ 0x3de0540] Error initializing a frames context for an internal frame allocation request
[hevc_qsv @ 0x3de0540] Error initializing the encoder: failed to allocate memory (-4)
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
[aac @ 0x3de2700] Qavg: 55952.926
[aac @ 0x3de2700] 2 frames left in the queue on closing
Conversion failed!

参考情報

FFmpeg 4 以降で、enable-libmfx を付けて configure したい場合、YUM で binutils libdrm-devel をインストールしておかないと下記のようなエラーとなります。

/usr/bin/ld: /opt/intel/mediasdk/lib/lin_x64/libmfx.a(main.cpp.o): unrecognized relocation (0x2a) in section `.text'
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
require libmfx mfx/mfxvideo.h MFXInit -llibmfx
check_lib libmfx mfx/mfxvideo.h MFXInit -llibmfx
check_func_headers mfx/mfxvideo.h MFXInit -llibmfx
check_ld cc -llibmfx
check_cc
BEGIN /tmp/ffconf.BmTKKIWa/test.c
    1   #include <mfx/mfxvideo.h>
    2   #include <stdint.h>
    3   long check_MFXInit(void) { return (long) MFXInit; }
    4   int main(void) { int ret = 0;
    5    ret |= ((intptr_t)check_MFXInit) & 0xFFFF;
    6   return ret; }
END /tmp/ffconf.BmTKKIWa/test.c
gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -std=c11 -fomit-frame-pointer -pthread -c -o /tmp/ffconf.BmTKKIWa/test.o /tmp/ffconf.BmTKKIWa/test.c
/tmp/ffconf.BmTKKIWa/test.c:1:26: fatal error: mfx/mfxvideo.h: No such file or directory
 #include <mfx/mfxvideo.h>
                          ^
compilation terminated.
ERROR: libmfx not found

FFmpeg
Sponsored Links
hirooka.pro