qsv 対応の ffmpeg をつくる


hardware acceleration の Wiki:HWAccelIntro – FFmpeg

関連記事
ffmpeg に nvenc(cuda) をインストールする

追記 2015年5月31日
Zeranoe build が ffmpeg-20150525-git-e48a9ac から対応した。
libmfx Added | Zeranoe FFmpeg

ffmpeg-20150610-git-913685f を最後に非対応になっているので必要な場合は直接保存する。理由は XP 対応 のため。
Zeranoe FFmpeg – Builds win32
Zeranoe FFmpeg – Builds win64

その後2016年3月1日より XP のサポートを終了し配布を再開した。
Windows XP Support And Intel QSV – Zeranoe FFmpeg

基本となるファイル

ビルド環境の構築

ビルド環境の構築は 【AAC+】 HE-AAC が使える ffmpeg をつくる方法 を参考に msysgitMSYS_MinGW-w64_GCC_xxx_x86-x64_Full を上書きした物を使う。

msys.bat を実行して MSYS/home/<ユーザー名> 以下にソースファイルを解凍してインストールを行うが、その前に MSYS/bin の pkg-config.exe をコピー&リネームする。

$ copy pkg-config.exe i686-w64-mingw32-pkg-config.exe
$ copy pkg-config.exe x86_64-w64-mingw32-pkg-config.exe

ffmpeg をつくる

mfx_dispatch-master

$ cd mfx_dispatch-master
$ autoreconf -fiv
$ PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" ./configure --build=i686-w64-mingw32 --host="i686-w64-mingw32" --prefix="/mingw/i686-w64-mingw32" --bindir=/mingw/i686-w64-mingw32 --disable-shared --enable-static --enable-fast-install
$ make && make install

64bit なら

$ PKG_CONFIG_PATH="/mingw/x86_64-w64-mingw32/lib/pkgconfig" ./configure --build=x86_64-w64-mingw32 --host="x86_64-w64-mingw32" --prefix="/mingw/x86_64-w64-mingw32" --bindir=/mingw/x86_64-w64-mingw32 --disable-shared --enable-static --enable-fast-install

ffmpeg

$ cd ffmpeg
$ PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" ./configure --prefix=/mingw/i686-w64-mingw32 --enable-version3 --enable-gpl --enable-libmfx --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages"
$ make

64bit なら

$ PKG_CONFIG_PATH="/mingw/x86_64-w64-mingw32/lib/pkgconfig" ./configure --cross-prefix="x86_64-w64-mingw32-" --enable-version3 --enable-cross-compile --enable-version3 --enable-gpl --enable-libmfx --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-debug --extra-ldflags=-static --extra-libs="-lsupc++ -lstdc++" --target-os=mingw32 --arch=x86_64 --cpu=x86_64

最新版の ffmpeg のスナップショット を使う場合はこのファイルを上書きする。公式のファイルが適宜更新されるので make が通らなくなったら必要に応じて書き換える。

実行コマンド例

以下のようなエラーが出る場合は look_ahead 0 をつける

More than one of: { constant qscale, lookahead, VCM } requested, only one of them can be used at a time.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

以下のようなエラーが出る場合は init_hw_device qsv:hw をつける
https://trac.ffmpeg.org/ticket/6492 より
詳しくは https://ffmpeg.org/ffmpeg-all.html#Advanced-Video-options

No device available for encoder (device type qsv for codec h264_qsv).
Selected ratecontrol mode is not supported by the QSV runtime. Choose a different mode.
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

以下のようなエラーが出る場合は一度 remux するとエラーがなくなるかもしれない。

Decoding pixel format ‘(null)’ is not supported
Error while decoding stream #0:0: Function not implemented

remux
ffmpeg -i input.ts -c copy out.ts
CBR(固定ビットレート):ffmpeg -init_hw_device qsv:hw -i input -c:v h264_qsv -look_ahead 0 -b:v 2000k -maxrate 2000k -acodec copy output.mp4
VBR(可変ビットレート):ffmpeg -init_hw_device qsv:hw -i input -c:v h264_qsv -look_ahead 0 -b:v 4000k -acodec copy output.mp4
CQP(品質指定):ffmpeg -init_hw_device qsv:hw -i input -c:v h264_qsv -look_ahead 0 -q 20 -acodec copy output.mp4

ニコ生のように制限ビットレートがある場合は VBR にすることで制限できる。CQP のビットレートは配信映像に依存するので使い慣れればこちらでも良い。

エンコード設定

ffmpeg -h encoder=h264_qsvで見られるエンコード設定とエンコーダ全般に指定できる設定の2つがある。

Encoder h264_qsv [H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration)]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: nv12 p010le qsv
h264_qsv encoder AVOptions:
  -async_depth               E..V.... Maximum processing parallelism (from 0 to INT_MAX) (default 4)
  -avbr_accuracy             E..V.... Accuracy of the AVBR ratecontrol (from 0 to INT_MAX) (default 0)
  -avbr_convergence          E..V.... Convergence of the AVBR ratecontrol (from 0 to INT_MAX) (default 0)
  -preset                    E..V.... (from 1 to 7) (default medium)
     veryfast                     E..V....
     faster                       E..V....
     fast                         E..V....
     medium                       E..V....
     slow                         E..V....
     slower                       E..V....
     veryslow                     E..V....
  -vcm                       E..V.... Use the video conferencing mode ratecontrol (from 0 to 1) (default 0)
  -rdo                       E..V.... Enable rate distortion optimization (from -1 to 1) (default -1)
  -max_frame_size            E..V.... Maximum encoded frame size in bytes (from -1 to 65535) (default -1)
  -max_slice_size            E..V.... Maximum encoded slice size in bytes (from -1 to 65535) (default -1)
  -bitrate_limit             E..V.... Toggle bitrate limitations (from -1 to 1) (default -1)
  -mbbrc                     E..V.... MB level bitrate control (from -1 to 1) (default -1)
  -extbrc                    E..V.... Extended bitrate control (from -1 to 1) (default -1)
  -adaptive_i                E..V.... Adaptive I-frame placement (from -1 to 1) (default -1)
  -adaptive_b                E..V.... Adaptive B-frame placement (from -1 to 1) (default -1)
  -b_strategy                E..V.... Strategy to choose between I/P/B-frames (from -1 to 1) (default -1)
  -cavlc                     E..V.... Enable CAVLC (from 0 to 1) (default 0)
  -idr_interval              E..V.... Distance (in I-frames) between IDR frames (from 0 to INT_MAX) (default 0)
  -pic_timing_sei            E..V.... Insert picture timing SEI with pic_struct_syntax element (from 0 to 1) (default 1)
  -single_sei_nal_unit         E..V.... Put all the SEI messages into one NALU (from -1 to 1) (default -1)
  -max_dec_frame_buffering         E..V.... Maximum number of frames buffered in the DPB (from 0 to 65535) (default 0)
  -look_ahead                E..V.... Use VBR algorithm with look ahead (from 0 to 1) (default 1)
  -look_ahead_depth          E..V.... Depth of look ahead in number frames (from 0 to 100) (default 0)
  -look_ahead_downsampling         E..V.... (from 0 to 2) (default unknown)
     unknown                      E..V....
     off                          E..V....
     2x                           E..V....
  -int_ref_type              E..V.... Intra refresh type (from -1 to 65535) (default -1)
     none                         E..V....
     vertical                     E..V....
  -int_ref_cycle_size         E..V.... Number of frames in the intra refresh cycle (from -1 to 65535) (default -1)
  -int_ref_qp_delta          E..V.... QP difference for the refresh MBs (from -32768 to 32767) (default -32768)
  -recovery_point_sei         E..V.... Insert recovery point SEI messages (from -1 to 1) (default -1)
  -trellis                 E..V.... Trellis quantization (default 0)
     off                          E..V....
     I                            E..V....
     P                            E..V....
     B                            E..V....
  -profile                   E..V.... (from 0 to INT_MAX) (default unknown)
     unknown                      E..V....
     baseline                     E..V....
     main                         E..V....
     high                         E..V....
  -a53cc                     E..V.... Use A53 Closed Captions (if available) (from 0 to 1) (default 1)

エンコーダ全体のオプション

g [int]
keyint のこと。無指定だと10秒に1つキーフレームが付く。libx264 のようにキーフレーム間隔は可変にならない。

hevc_qsv エンコーダを使う

Kaby Lake CPU 以降であれば hevc_qsv エンコーダが使える。

コマンド例
ffmpeg -i input -c:v hevc_qsv -load_plugin hevc_hw -preset:v faster output.mkv

QSV デコーダを使う

デコーダ一覧

  • h264_qsv
  • mpeg2_qsv
  • hevc_qsv
  • vc1_qsv
  • vp8_qsv

CPU をフル活用してエンコードする場合、デコードの CPU 負荷を減らしその分をエンコードに使うことで速度の向上が見込まれる。

デコーダの部分についてコメントをいただいていたが、サーバのアカウント削除によりデータベースの保存が間に合わなかったのでコメントが消えてしまった。申し訳ない。

追記 2015年7月29日
デコーダも追加された。他にも HEVC、H264 も追加されている。
avcodec: Add QSV MPEG-2 video decoder :: git.videolan.org Git – ffmpeg.git/commitdiff
avcodec: Add QSV VC-1 video decoder :: git.videolan.org Git – ffmpeg.git/commitdiff

無指定だとソフトウェアデコードになるので、入力の前にデコーダを指定
ffmpeg -vcodec h264_qsv -i input
hevc の場合
ffmpeg -vcodec hevc_qsv -i input

デコーダは ffmpeg -decoders > decoders.txt 2>&1 で一覧をテキストで見ることが出来る。

QSV フィルタを使う

ffmpeg 3.3 までにデインターレーサとリサイザが追加された。ただし ffmpeg で使えても ffplay では使えないのでプレビュー用途ならパイプして ffplay に渡す。また入力ファイルに応じて QSV デコーダを使わないと QSV フィルタが使えない。

リサイズ
ffmpeg -hwaccel qsv -vcodec h264_qsv -init_hw_device qsv:hw -i input.mp4 -vf scale_qsv=1280:720,hwdownload,format=nv12 -vcodec h264_qsv -look_ahead 0 -q 20 -acodec copy out.mp4

デインターレース(bob になる)
ffmpeg -hwaccel qsv -vcodec mpeg2_qsv -init_hw_device qsv:hw -i input.ts -vf deinterlace_qsv,hwdownload,format=nv12 -vcodec h264_qsv -look_ahead 0 -q 20 -acodec copy out.mp4

TS ファイルをデインターレスしてリサイズし、重複フレームを間引く(30p)
ffmpeg -hwaccel qsv -vcodec mpeg2_qsv -init_hw_device qsv:hw -i input.ts -vf deinterlace_qsv,scale_qsv=1280:-1,hwdownload,format=nv12,fps=30000/1001 -vcodec h264_qsv -look_ahead 0 -q 20 -acodec copy out.mp4

TS ファイルをデインターレスしてリサイズし、重複フレームを間引く(24p)
ffmpeg -hwaccel qsv -vcodec mpeg2_qsv -init_hw_device qsv:hw -i input.ts -vf deinterlace_qsv,scale_qsv=1280:-1,hwdownload,format=nv12,fps=30000/1001,decimate -r 24000/1001 -vcodec h264_qsv -look_ahead 0 -q 20 -acodec copy out.mp4

ffplay にパイプする
ffmpeg -hwaccel qsv -vcodec mpeg2_qsv -init_hw_device qsv:hw -i input.ts -vf deinterlace_qsv,scale_qsv=1280:-1,hwdownload,format=nv12,fps=30000/1001,decimate -c:v rawvideo -acodec copy -f nut - | ffplay -

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)