(FFmpeg2.8以降に対応した記事はこちら)
自前でQSV対応のWindows版FFmpegをビルドして遊んだ時の備忘録。
はじめにことわっておきますが、今回初めてdiffを使ってパッチを作成したような素人のお遊びですので温かい目で見てあげてください。
公式スナップショットを試す
FFmpegのコミット履歴を眺めていたら3月下旬頃に「libmfx-based H.264 encoder」の文字を発見。早速スナップショットをビルドして、「-codecs」を見ると確かに「encoders: h264_qsv 」となっていた。
これでFFmpegもQSVのエンコードに対応かと思ったのだが実際に使用してみると問題が発覚。
エンコード中に次のメッセージが大量発生し、出来上がった動画は再生されるもののシークすると映像が真っ黒になる。
Non-monotonous DTS in output stream 0:0; previous: XX, current: 0; changing to XX. This may result in incorrect timestamps in the output file.
原因などわかる筈もなく、私のような素人はリリース版で対応になるまで待った方が良さげか・・・・
最新のFFmpeg(Stable版)をQSVに対応させてみる
と思ったのだが、折角なのでFFmpegのQSV対応について色々ググってみたところ非公式に対応しているものがあるようだ。
ただしバージョンが2.2のソースだったので今日現在最新の2.6.2に対応させてみた。
2.7に対応させてみた。
以下、やってみた手順。
必要なツールの準備 (MSYS + MinGW + GCC)
XhmikosR’s さんのところのをそのまま使わせていただきました。
(使用したバージョンは MSYS_MinGW-w64_GCC_492_x86-x64_Full.7z)
「MSYS」をCドライブのルートに展開して、「msys.bat」を実行。以降CLIでの操作。
(「home」以下にユーザー名のディレクトリが作成されるので、ファイルはWindows側でそこに展開)
mfx_dispatchのビルド
詳細はよくわからないのだが直接 libmfx を使うのがダメらしく、その回避策らしい。
自前でビルドして使う分には大丈夫なのかもしれないけど念の為。
mfx_dispatch-master.zipを「Download ZIP」からダウンロードして展開&ビルド。
$ cd ~/mfx_dispatch-master $ autoreconf -fiv $ PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" \ ./configure --prefix="/mingw/i686-w64-mingw32" \ --disable-shared \ --enable-static \ --enable-fast-install $ make $ make install
configureのオプションについては以下サイト様を参考にさせていただきました。
FFmpegのビルド
公式stable版のソースをベースに、QSVに対応した非公式2.2のH264_qsvエンコード部分を使えるようにする。
①FFmpegのソースを公式サイトからダウンロードして展開。
(ffmpeg-2.6.2.tar.bz2)
(ffmpeg-2.7.tar.bz2)
②QSVに対応した非公式2.2のソースを「Download ZIP」からダウンロードして展開。(ffmpeg-qsv-qsvenc.zip)
③非公式2.2のソースからQSVエンコードまわりのコードを拝借。
次の3つを公式側へコピー(上書き)。
- libavcodec\qsvenc.c
- libavcodec\qsvenc.h
- libavcodec\qsvenc_h264.c
(こういうやり方ってライセンス的にはバイナリ配布しなければOKなんだろうか??)
④公式ソースのQSVまわりを修正。
ffmpeg-2.6.2_qsv_patch.zip
ffmpeg-2.7_qsv_patch.zip
上のファイルをダウンロードして公式ソースのディレクトリに展開&パッチを当てる。
$ cd ~/ffmpeg-2.7 $ patch -p1 < ffmpeg-2.7_qsv.diff
はじめてパッチ作ったので動作の保証は微妙。。
⑤FFmpegをビルド
$ cd ~/ffmpeg-2.7 $ PKG_CONFIG_PATH="/mingw/i686-w64-mingw32/lib/pkgconfig" \ ./configure --prefix="/mingw/i686-w64-mingw32" \ --enable-gpl \ --enable-version3 \ --enable-libmfx \ --enable-w32threads \ --disable-dxva2 \ --disable-debug \ --disable-doc \ --disable-ffplay \ --disable-ffprobe \ --pkg-config-flags="--static" \ --extra-ldflags="-static" \ --extra-libs="-lsupc++ -lstdc++" $ make
色をつけた部分が必須と思われる。(たぶん)
以上で完成。
なお、上記の方法でビルドしたFFmpegは32bit版です。
使い方は前述のdrocon11/ffmpeg-qsvやqsv 対応の ffmpeg をつくる | ニコラボさんを参照のこと。
注意点
スナップショット版と非公式版ではオプションが若干異なるもよう。
例えばスナップショット版はプリセットが「fast」「medium」「slow」とx264っぽいのに対して、非公式版は「speed」「balanced」「quality」になっている。(別の非公式QSV対応ソースだとx264と同じように使えるのもあるようですが)
それから非公式版だとCQPが使えるようです。
最後に、ライセンスについて詳しくないので何かしらの問題があったらゴメンナサイ。
追記
2016/02/18
記事タイトルを変更しました。(FFmpeg2.7用として)
2015/07/20
2.7.2でも同じ方法でQSVに対応できるのを確認しました。
2.7表記部分をを2.7.2に置き換えてください。(拙作パッチファイル名を除く)
2015/06/10
2.7用に内容変更しました。(パッチ含む)
パッチの置き場所をOneDriveに変更しました。
configureオプションを若干修正しました。
2015/05/18
2.6.3でも同じ方法でQSVに対応できるのを確認しました。
2.6.2表記部分をを2.6.3に置き換えてください。(拙作パッチファイル名を除く)
動作上は問題ないですがconfigureオプションを若干修正しました。