qsv 対応の ffmpeg をつくる


ハードウェアエンコーダーの nvenc は次期バージョンの 2.6 から取り込まれる予定だが、Sandy Bridge 以降の intel 製の CPU を使っている多くの人に解放されている qsv(Quick Sync Video) も非公式ながら ffmpeg でも使えるのでその ffmpeg のつくり方の紹介。

hardware acceleration の Wiki:HWAccelIntro – FFmpeg
ffmpeg に nvenc(cuda) をインストールする

追記 2015年4月12日
2.6 バージョンで追加されたのはエンコーダーの方でデコーダーはまだ公式には取り込まれていないが、次期バージョンにはデコーダーも予定されている。

追記 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 で一覧をテキストで見ることが出来る。

今回追加されたデコーダー

  • h264_qsv
  • mpeg2_qsv
  • hevc_qsv
  • vc1_qsv

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

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

git.videolan.org Git – ffmpeg.git/blob – Changelog

追記 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 が通らなくなったら必要に応じて書き換える。

公式が対応したので 公式のスナップショット を利用する。

実行コマンド例

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

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

設定可能なオプション

ffmpeg -h encoder=h264_qsv

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 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 0)

コメントを残す

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