ffmpeg ハードウェア アクセラレーション エンコードと yadif に関する問題

ffmpeg ハードウェア アクセラレーション エンコードと yadif に関する問題

mts コンテナにインターレース ビデオがあり、それを mkv コンテナ (おそらく HEVC) の非インターレース ビデオに変換したいと考えています。

次のコマンドラインを試しました:

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf yadif=1 "test.mkv"

そしてエラーが発生します:

Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scaler_0'
Error reinitializing filters!
Failed to inject frame into filter network: Function not implemented
Error while processing the decoded data for stream #0:0
Conversion failed!

すべてを削除すると-vf yadif=1正常に動作しますが、yadif が作業を実行して再度アップロードできるように、iGPU からメモリにフォーマットをダウンロード/アップロード/変換する必要があることを ffmpeg に指示する必要があると思いますが、その方法がわかりません。

答え1

https://trac.ffmpeg.org/wiki/HWAccelIntro

https://ffmpeg.org/ffmpeg-filters.html#hwdownload-1

ffmpeg -y -hwaccel qsv -c:v h264_qsv -i "2008-07-13 00.08.47.mts" -c:v hevc_qsv -global_quality 20 -look_ahead 1 -vf hwdownload,format=nv12,yadif=1 "test.mkv"

その他の HW アクセラレーション。 https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

答え2

vpp_qsvトランスコーディング チェーンではGPU アクセラレーション フィルターを使用できます。その使用方法は、次の方法で印刷できます。

ffmpeg -h filter=vpp_qsv

上記の場合、解決策は次のようになります。

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 "test.mkv"

説明:

ビデオフィルタチェーンについては、MFXランタイムに必要な、extra_hw_frames=64に渡される追加の引数を参照してください。hwupload固定のフレームプールサイズが必要事前に割り当てられます。要件に適した番号を使用してください。通常、次のような機能を使用する場合は、より大きな番号(64程度)が必要になります。先読み (LA-ICQ)

チェーンの2番目のフィルタは でvpp_qsv、オプション を介して高度なデインターレースを実行するために呼び出されますdeinterlace=2。このフローでは、デコード、トランスコード、フィルタリング(この場合はデインターレース)はすべてGPUで実行されます。オプション は、async_depth=4次に示すようにパフォーマンスを大幅に向上させます。このコミットメッセージ

これこれが、私がオプションを省略した理由です-lookahead 1(今のところ)。 変更があった場合は、テストして報告します。

によるとこれコミット、エンコーダー ラッパーの先読みにはhevc_qsv拡張ビットレート制御モードもオンに切り替える必要があるため、先読みを使用する前のコマンドは次のようになります。

ffmpeg -threads 4 -y -fflags +genpts -init_hw_device qsv=hw \
-hwaccel qsv -hwaccel_output_format qsv \
-filter_hw_device hw -c:v h264_qsv \
-i "2008-07-13 00.08.47.mts" \
-vf "format=nv12|qsv,hwupload=extra_hw_frames=64,vpp_qsv=deinterlace=2:async_depth=4" \
-c:v hevc_qsv  -global_quality 20 -look_ahead 1 -extbrc 1 "test.mkv"

テストして報告してください。

警告:

SDKではデッドロックを防ぐために少なくとも2つのスレッドが必要であることに注意してください。これコードブロック。

関連情報