前回まででMSS版ffmpeg h264_qsvが作成できる事がわかりました。
今日はそれを利用したエンコードの実情を説明したいと思います。
早速実験結果から行きます。
まずwindowsの様なオプションではiGPUを利用できていないことが判明しました。
例えばこんな感じ
ffmpeg -y -i "test.mp4" -vcodec h264_qsv -q 23 -look_ahead 0 -acodec aac -loglevel error "sample.mp4"
これだとWindows版だとちゃんとqsvの性能を利用して、実測180fps位でトランスコードできています。
が、centos版だと同じ素材、同じコマンドでもtopコマンドで見てみるとfpsが45位でCPUフルパワー利用しているのがわかります。
では利用されるのはどんな状態なのでしょうか
色々とオプション探しの旅に出ました。そこでいくつかのオプションにたどり着きました。
ffmpeg -y \ -loglevel error \ -init_hw_device qsv=qsv:MFX_IMPL_hw_any -hwaccel qsv -filter_hw_device qsv \ -c:v h264_qsv \ -i "000test.mp4" \ -vf 'format=nv12,deinterlace_qsv' \ -c:v h264_qsv -look_ahead 0 -q:v 20 \ -acodec copy \ "000test.mp4"
つまりハードウェアを初期化する際に「ハードウェアを利用する」「フィルタもハードウェアを利用する」と宣言し、最初のh264_qsvでハードウェアに乗せ、deinterlaceフィルタもハードウェアを利用しなくてはなりません。
ではtsファイルはどうなのでしょうか?
ffmpeg -y \ -loglevel error \ -init_hw_device qsv=qsv:MFX_IMPL_hw_any -hwaccel qsv -filter_hw_device qsv \ -vcodec mpeg2_qsv \ -i "000test.ts" \ -vf 'format=nv12,deinterlace_qsv' \ -c:v h264_qsv -look_ahead 0 -q:v 20 \ -acodec copy \ "000test.mp4"
これをやったらソースが悪いよと言われエラー続発。それでもあきらめず、素材を探すもいいm2ts素材が見つからない。
そこで逆質問。どうやったらmpeg2_qsvに読み込ませるファイルが作れますか?とググったら
ffmpeg -y -analyzeduration 30M -probesize 30M -i "test.ts" -fflags +discardcorrupt -c copy output.ts
これで中間ファイル的に作成すれば行けるっぽい。
このファイルを
ffmpeg -y \ -loglevel error \ -init_hw_device qsv=qsv:MFX_IMPL_hw_any -hwaccel qsv -filter_hw_device qsv \ -vcodec mpeg2_qsv \ -i "output.ts" \ -vf 'format=nv12,deinterlace_qsv' \ -c:v h264_qsv -look_ahead 0 -q:v 20 \ -acodec copy \ "000test.mp4"
これで通りました。
ちなみに
ffmpeg -y -analyzeduration 30M -probesize 30M -i "test.ts" -fflags +discardcorrupt -c copy output.ts ffmpeg -y -init_hw_device qsv:hw -hwaccel qsv -c:v mpeg2_qsv -i "output.ts" -vf deinterlace_qsv,scale_qsv=1280:720 -fflags +discardcorrupt -c:v h264_qsv -look_ahead 0 -q:v 20 -acodec copy out.mp4
とするとdeinterlaceとscaleでいい感じにしてくれます。
大体220fps辺りを平均して出しているのでハードウェアは利用されていると思われます。
んじゃ地デジは全部これで行けるのかと思ったら、そうでもないらしい。analyzedurationは最初の部分のチェックをしていてお尻の方は考えていないらしい。
試しにTMPGEnc MPEG Smart Rendererで頭とお尻をIフレームで切ってあげたら通りました。これは最終手段だけど。
これでは使い物にならない。どうしてqsvを利用するかは、何も考えずにハードウェアを利用したいという事が元にあるので意味が無いという結果に落ちてしまいました。
これなら素直に中古グラボ買ってきてつなげた方が確実に成果が出るなと思いました。
コメント