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

スポンサーリンク

はじめに

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

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

なお、過去のバージョン時の投稿は下記の通りです。

Intel Media Server Studio 2018 R2 がリリースされる模様
2018 年内に、もう 1 回リリースされるみたい そういえば、2018 年 4 月に Intel Media Server Studio 2018 R1 がリリースされたけど、今年のリリースは 1 回のみかな?と思っていたところ、Int...
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 Ser...
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 ...
Intel Media Server Studio 2017 R2 と FFmpeg 3.2.3 と Linux (CentOS 7.2 1511) で QSV (Quick Sync Video)
2017-01-20 に Intel から NEW! Intel Media Server Studio 2017 R2 というタイトルのメールが来ていました。というわけでダウンロードして試してみました。 なお、過去のバージョン時のポ...
Linux (CentOS 7.2 1511) と FFmpeg で QSV (Quick Sync Video)
最近,Intel Media Server Studio 2017 がリリースされたとのこと.第6世代 Core の Skylake がサポートされたとのことで試してみました.以前はカーネルをビルドしないといけなかったですが,今回のバージョ...
Linux (CentOS 7.1) と FFmpeg 3.0.1 で QSV (Quick Sync Video)
Linux と FFmpeg で QSV をやりたくて Haswell な Core i3 を買いましたという話. 環境 Intel Core i3-4170 (Haswell Refresh) ASUS B85M-E Ce...

Intel Media Server Studio 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

参考公式情報

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

Intel Media Server Studio - Community Edition
2018 2018_R2
Build date:04 Dec 2018
MediaServerStudioEssentials2018_16.9_00183.tar.gz 712 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 を選択しました。

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

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

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

tar zxvf MediaServerStudioEssentials2018_16.9_00183.tar.gz
cd MediaServerStudioEssentials2018_16.9_00183
tar zxvf SDK2018Production16.9.tar.gz
cd SDK2018Production16.9
cd centos
tar zxvf install_scripts_centos_16.9-00183.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]

インストールスクリプトは 30 分程度で完了しました。

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                 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 MediaServerStudioEssentials2018_16.9_00183
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.183

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.090081 sec
-------------------------------------------------------------------------------
*** session 0 [0x56338978] PASSED (MFX_ERR_NONE) 0.090013 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-01-04 JST 時点で最新の FFmpeg 4.1 “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.tar.bz2 && \
    tar jxvf ffmpeg-4.1.tar.bz2 && \
    cd ffmpeg-4.1 && \
    ./configure --enable-libmfx && \
    make -j$(nproc) && \
    sudo make install

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

ffmpeg -version

結果、

ffmpeg version 4.1 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      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 で何かビデオファイルをトランスコードしてみます。

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_qsv.mp4

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

ffmpeg version 4.1 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      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
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 'output_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         : Lavf58.20.100
    Stream #0:0(und): Video: h264 (h264_qsv) (avc1 / 0x31637661), qsv, 1920x1080, q=-1--1, 5000 kb/s, 24 fps, 12288 tbn, 24 tbc (default)
    Metadata:
      creation_time   : 1970-01-01T00:00:00.000000Z
      handler_name    : VideoHandler
      encoder         : Lavc58.35.100 h264_qsv
    Side data:
      cpb: bitrate max/min/avg: 5000000/0/5000000 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         : Lavc58.35.100 aac
frame= 1253 fps=205 q=26.0 Lsize=   32083kB time=00:00:52.12 bitrate=5042.2kbits/s speed=8.51x    
video:31250kB audio:800kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.103791%
[aac @ 0x28c2f80] Qavg: 2941.320

なお、FFmpeg wiki: Hardware/QuickSync https://trac.ffmpeg.org/wiki/Hardware/QuickSync にあるように、上記のオプションを付けないと、下記のようなエラーとなります。

[h264_qsv @ 0x2d8b5c0] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x2d8b5c0] Current frame rate is unsupported
[h264_qsv @ 0x2d8b5c0] Current picture structure is unsupported
[h264_qsv @ 0x2d8b5c0] Current resolution is unsupported
[h264_qsv @ 0x2d8b5c0] Current pixel format is unsupported
[h264_qsv @ 0x2d8b5c0] 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 @ 0x2d8d640] Qavg: 55952.926
[aac @ 0x2d8d640] 2 frames left in the queue on closing
Conversion failed!

FFmpeg (hevc_qsv)

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

しかし、私の環境では、FFmpeg Snapshot, FFmpeg 4.1, FFmpeg 4.0.3 では下記のようなエラーでトランスコードできませんでした。

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

FFmpeg Snapshot

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_qsv.mp4

[hevc_qsv @ 0x3417ac0] Initialized an internal MFX session using hardware accelerated implementation
[hevc_qsv @ 0x3417ac0] Using the constant bitrate (CBR) ratecontrol method
[hevc_qsv @ 0x3417ac0] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x3417ac0] Current frame rate is unsupported
[hevc_qsv @ 0x3417ac0] Current picture structure is unsupported
[hevc_qsv @ 0x3417ac0] Current resolution is unsupported
[hevc_qsv @ 0x3417ac0] Current pixel format is unsupported
[hevc_qsv @ 0x3417ac0] 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
[AVIOContext @ 0x3413a80] Statistics: 0 seeks, 0 writeouts
[AVIOContext @ 0x3409940] Statistics: 2986128 bytes read, 2 seeks
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_qsv.mp4

[AVHWDeviceContext @ 0x2cab740] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x2cab740] Driver not found in known nonstandard list, using standard behaviour.
[hevc_qsv @ 0x2a52380] Using the constant bitrate (CBR) ratecontrol method
[AVHWDeviceContext @ 0x2ec5b40] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x2ec5b40] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x2f63a80] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x2f63a80] Driver not found in known nonstandard list, using standard behaviour.
[AVHWFramesContext @ 0x2f864c0] Unsupported format: pal8.
[AVHWFramesContext @ 0x2f87880] Error initializing a child frames context
[AVHWFramesContext @ 0x2f87880] Error creating an internal frame pool
[hevc_qsv @ 0x2a52380] Error initializing a frames context for an internal frame allocation request

FFmpeg 4.1

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_qsv.mp4

[hevc_qsv @ 0x3a97ac0] Initialized an internal MFX session using hardware accelerated implementation
[hevc_qsv @ 0x3a97ac0] Using the constant bitrate (CBR) ratecontrol method
[hevc_qsv @ 0x3a97ac0] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x3a97ac0] Current frame rate is unsupported
[hevc_qsv @ 0x3a97ac0] Current picture structure is unsupported
[hevc_qsv @ 0x3a97ac0] Current resolution is unsupported
[hevc_qsv @ 0x3a97ac0] Current pixel format is unsupported
[hevc_qsv @ 0x3a97ac0] 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
[AVIOContext @ 0x3a98d40] Statistics: 0 seeks, 0 writeouts
[AVIOContext @ 0x3a89940] Statistics: 2986128 bytes read, 2 seeks
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_qsv.mp4

[AVHWDeviceContext @ 0x28c5f40] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x28c5f40] Driver not found in known nonstandard list, using standard behaviour.
[hevc_qsv @ 0x260b380] Using the constant bitrate (CBR) ratecontrol method
[AVHWDeviceContext @ 0x2b35580] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x2b35580] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x2a5ea80] VAAPI driver: Intel iHD driver - 16.9.00183.
[AVHWDeviceContext @ 0x2a5ea80] Driver not found in known nonstandard list, using standard behaviour.
[AVHWFramesContext @ 0x2b3e000] Unsupported format: pal8.
[AVHWFramesContext @ 0x2b3f3c0] Error initializing a child frames context
[AVHWFramesContext @ 0x2b3f3c0] Error creating an internal frame pool
[hevc_qsv @ 0x260b380] Error initializing a frames context for an internal frame allocation request

FFmpeg 4.0.3

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_qsv.mp4

[hevc_qsv @ 0x385df40] Initialized an internal MFX session using hardware accelerated implementation
[hevc_qsv @ 0x385df40] Using the constant bitrate (CBR) ratecontrol method
[hevc_qsv @ 0x385df40] Selected ratecontrol mode is unsupported
[hevc_qsv @ 0x385df40] Current frame rate is unsupported
[hevc_qsv @ 0x385df40] Current picture structure is unsupported
[hevc_qsv @ 0x385df40] Current resolution is unsupported
[hevc_qsv @ 0x385df40] Current pixel format is unsupported
[hevc_qsv @ 0x385df40] 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
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_qsv.mp4

[AVHWDeviceContext @ 0x34d2480] Unknown driver "Intel iHD driver - 16.9.00183", assuming standard behaviour.
[hevc_qsv @ 0x3311940] Using the constant bitrate (CBR) ratecontrol method
[AVHWDeviceContext @ 0x34ce080] Unknown driver "Intel iHD driver - 16.9.00183", assuming standard behaviour.
[AVHWDeviceContext @ 0x4531f80] Unknown driver "Intel iHD driver - 16.9.00183", assuming standard behaviour.
[AVHWFramesContext @ 0x4532180] Unsupported format: pal8.
[AVHWFramesContext @ 0x43eec00] Error initializing a child frames context
[AVHWFramesContext @ 0x43eec00] Error creating an internal frame pool
[hevc_qsv @ 0x3311940] Error initializing a frames context for an internal frame allocation request
[hevc_qsv @ 0x3311940] 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
Conversion failed!

FFmpeg 3.4.5

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

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

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

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

curl -O https://download.blender.org/durian/trailer/sintel_trailer-1080p.mp4
/usr/local/ffmpeg-3.4.5/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_qsv.mp4

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

ffmpeg version 3.4.5 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-16)
  configuration: --enable-libmfx --prefix=/usr/local/ffmpeg-3.4.5
  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 'output_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: hevc (hevc_qsv) (hev1 / 0x31766568), nv12, 1920x1080, q=2-31, 5000 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: 5000000/0/5000000 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
(snip)
frame= 1253 fps= 69 q=-0.0 Lsize=   32103kB time=00:00:52.00 bitrate=5057.5kbits/s speed=2.85x    
video:31248kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.119228%
[aac @ 0x2985e40] Qavg: 660.242

参考情報

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

Quick Sync Video
スポンサーリンク
コピペワールド