ffmpeg hevc_vaapi: フィルター 'Parsed_null_0' とフィルター 'auto_scaler_0' でサポートされている形式間で変換できません

ffmpeg hevc_vaapi: フィルター 'Parsed_null_0' とフィルター 'auto_scaler_0' でサポートされている形式間で変換できません

Linux でハードウェア アクセラレーションを使用してファイルを H€VC にエンコードしようとしています。成功した試みは次のとおりです。

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec libx265 -crf 28 '/path/file.mp4'

しかし、30fps ほど遅いです。" ffmpeg -codecs|grep 265" は次のように表示されます: (エンコーダー: libx265 nvenc_hevc hevc_amf hevc_nvenc hevc_qsv hevc_v4l2m2m hevc_vaapi)

そこで私はhevc_vaapiを試しました:

ffmpeg -v verbose -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i '/path/file.mkv' -vcodec hevc_vaapi -crf 28 '/path/file.mp4'

しかし失敗します:

Impossible to convert between the formats supported by the filter 'Parsed_null_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
[AVIOContext @ 0x55d831121340] Statistics: 0 seeks, 0 writeouts
[aac @ 0x55d831142a00] Qavg: 30414.529
[aac @ 0x55d831142a00] 2 frames left in the queue on closing
[AVIOContext @ 0x55d831109ec0] Statistics: 65536 bytes read, 0 seeks
Conversion failed!

$ ffmpeg -hwaccels は「

Hardware acceleration methods:
vdpau
cuda
vaapi
qsv
drm

$ ヴァーピこれを示しています (va-api、mesa ドライバーがあるようです)

$ ls /dev/dri/*

/dev/dri/カード0 /dev/dri/レンダーD128

/dev/dri/by-path:

pci-0000:0a:00.0-カード pci-0000:0a:00.0-レンダリング

このエラーについてどう思いますか? また、HW H€VC アクセラレーションに使用する ffmpeg パラメータを見つけるにはどうすればよいですか?

更新: 「-hwaccel vaapi」は冗長なパラメータである可能性があると思います

答え1

次のような適切なエンコードパラメータが必要だと思います-vf 'format=nv12,hwupload'。次のワンライナーがあれば動作するかもしれません。VAAPI ドライバー:

echo "Input file:" && read -r i && echo "Quality: 25=identic, 30=a bit worse but small file size, or other numbers:" && read -r q && ffmpeg -vaapi_device /dev/dri/renderD128 -i "$i" -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f mp4 -rc_mode 1 -qp "$q" "$i.hevc.mp4"

答え2

他の回答はどれも役に立ちません。インストール後にintel-media-va-driver-non-freeをインストールするまで役に立ちません。https://wiki.debian.org/ハードウェアビデオアクセラレーション

sudo apt install intel-media-va-driver-non-free

Intel GPU を使用している場合は役立つはずです。

ビデオを拡大縮小する必要がある場合は、「format=nv12,hwupload」のような文字列を使用せずに「-vf scale_vaapi=640:360」を使用してビデオを拡大縮小します。

答え3

最初のコマンドでは、GPU を使用してデコードしているが、エンコードは CPU (libx265) を使用して実行していることを示しています。GPU はすばやくデコードしますが、デコードされたコンテンツは、グラフィック カードのメモリからコンピューターのメモリにダウンロードされた後にのみ、CPU で処理できます。このダウンロード プロセスはシステム全体にわたります。オーバーヘッドは非常に高く、CPU 純粋なソフトウェアによる同時エンコードとデコードのオーバーヘッドを超えるため、速度は非常に低くなります。2 番目のコマンドでは、最終的に GPU を使用してハードウェア アクセラレーションを同時にデコードおよびエンコードすることにしましたが、エンコードするコンテンツがグラフィック カードのハードウェアによってビデオ メモリにデコードされていることを GPU に伝えず、ハードウェア エンコードがサポートしていない crf パラメーターを使用しました。ハードウェア エンコードの crf に似たパラメーターは qp です。PS: 以下は私がよく使用するパラメーターです。

ffmpeg -init_hw_device vaapi=foo:/dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device foo -i '/path/file.mkv' -filter_hw_device foo -vf 'format=nv12|vaapi,hwupload' -c:v hevc_vaapi  -qp 24  -filter:a volume=1.5 -ar 44100 -acodec aac -ab 64k -y '/path/file_n.mkv'

答え4

次の 2 つのフラグを追加することをお勧めします。

  • -hwaccel vaapi
  • -hwaccel_output_format vaapi

コマンドラインは次のようになります。

ffmpeg -v verbose -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i INPUT.VIDEO -vf 'format=nv12,hwupload' -c:v hevc_vaapi OUTPUT.mp4

(私のコンピュータでは、vaapi_device を指定する必要はありません)

関連情報