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
CentOS 7.1 (1503)

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

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

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

Intel Media Server Studio – Community Edition.
(Essentials Edition without Intel Premier Support)
Intel Media Server Studio for Linux (199 MB)

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

CentOS 7.1 のインストール

Intel Media Server Studio for Linux では,CentOS 7.1.1503 のデフォルトカーネルがサポートされているようです.

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

http://vault.centos.org/7.1.1503/isos/x86_64/
CentOS-7-x86_64-DVD-1503-01.iso

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

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

uname -r

結果,

3.10.0-229.el7.x86_64

カーネルのバージョンは,このデフォルト固定なので,yum update でカーネルのバージョンアップを行わないように注意します.

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

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

sudo usermod -a -G video $USER

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

lspci -nn -s 00:02.0

結果,

00:02.0 VGA compatible controller [0300]: Intel Corporation 4th Generation Core Processor Family Integrated Graphics Controller [8086:041e] (rev 06)

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

次に,必要と思われるパッケージをインストールしておきます.

sudo yum -y groupinstall "Development Tools"
sudo yum -y install pciutils net-tools autoconf automake cmake freetype-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel mesa-dri-drivers wget bc

Intel Media Server Studio

既にダウンロードしている MediaServerStudioEssentials2016.tar.gz を使用して,Intel Media Server Studio 向けカーネルのビルドを行います.

tar zxvf MediaServerStudioEssentials2016.tar.gz
cd MediaServerStudioEssentials2016
tar zxvf SDK2016Production16.4.4.tar.gz 
cd SDK2016Production16.4.4
cd CentOS
tar zxvf install_scripts_centos_16.4.4-47109.tar.gz
sudo ./install_sdk_UMD_CentOS.sh
sudo mkdir /MSS
sudo chown $USER:$USER /MSS
cp build_kernel_rpm_CentOS.sh /MSS
cd /MSS
./build_kernel_rpm*.sh
cd /MSS/rpmbuild/RPMS/x86_64
sudo rpm -Uvh kernel-3.10.*.rpm
sudo reboot

build_kernel_rpm*.sh は,30分から1時間くらいかかる可能性があります.

再起動,カーネルのバージョンを確認してみます.

uname -r

結果,

3.10.0-229.1.2.47109.MSSr1.el7.centos.x86_64

lsmod で確認.

lsmod | grep 'i915'

結果,

i915                  938476  6 
i2c_algo_bit           13413  1 i915
drm_kms_helper         98274  1 i915
drm                   311336  5 i915,drm_kms_helper
i2c_core               40325  6 drm,i915,i2c_i801,drm_kms_helper,i2c_algo_bit,earth_pt1
video                  19263  2 i915,asus_wmi

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

これまでの設定が適切に行われているか,テストプラグラムを実行してみます.

cd MediaServerStudioEssentials2016
tar zxvf MediaSamples_Linux_2016_bin.tar.gz
cd MediaSamples_Linux_2016_bin
./sample_multi_transcode -i::h264 content/test_stream.264 -o::h264 out.h264 -hw -la

下記のように,PASS することを確認します.

Multi Transcoding Sample Version 6.0.16043361.361

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: 120
MFX HARDWARE Session 0 API ver 1.17 parameters: 
Input  video: AVC 
Output video: AVC 

Session 0 was NOT joined with other sessions

Transcoding started

Transcoding finished

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

The test PASSED

FFmpeg

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

wget https://www.ffmpeg.org/releases/ffmpeg-3.0.1.tar.bz2
tar jxvf ffmpeg-3.0.1.tar.bz2
cd ffmpeg-3.0.1
./configure --enable-libmfx
make -j4
sudo make install

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

ffmpeg -version

結果,

ffmpeg version 3.0.1 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. 17.103 / 55. 17.103
libavcodec     57. 24.102 / 57. 24.102
libavformat    57. 25.100 / 57. 25.100
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 31.100 /  6. 31.100
libswscale      4.  0.100 /  4.  0.100
libswresample   2.  0.101 /  2.  0.101

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

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) にトランスコードされているのかわかります.

ffmpeg version 3.0.1 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. 17.103 / 55. 17.103
  libavcodec     57. 24.102 / 57. 24.102
  libavformat    57. 25.100 / 57. 25.100
  libavdevice    57.  0.101 / 57.  0.101
  libavfilter     6. 31.100 /  6. 31.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
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-01 00:00:00
    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-01 00:00:00
      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-01 00:00:00
      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
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.25.100
    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-01 00:00:00
      handler_name    : VideoHandler
      encoder         : Lavc57.24.102 h264_qsv
    Side data:
      unknown side data type 10 (24 bytes)
    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-01 00:00:00
      handler_name    : SoundHandler
      encoder         : Lavc57.24.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= 1253 fps= 73 q=-0.0 Lsize=    6911kB time=00:00:52.16 bitrate=1085.3kbits/s speed=3.02x    
video:6061kB audio:817kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.482713%
[aac @ 0x3980c80] Qavg: 659.917
CentOSFFmpeg
スポンサーリンク
コピペワールド