![ffmpeg ハードウェア アクセラレーション エンコードと yadif に関する問題](https://rvso.com/image/1615251/ffmpeg%20%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%20%E3%82%A2%E3%82%AF%E3%82%BB%E3%83%A9%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%20%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%20yadif%20%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E5%95%8F%E9%A1%8C.png)
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つのスレッドが必要であることに注意してください。これコードブロック。