Probleme mit der hardwarebeschleunigten Kodierung von ffmpeg und yadif

Probleme mit der hardwarebeschleunigten Kodierung von ffmpeg und yadif

Ich habe Interlaced-Videos in einem MTS-Container und möchte sie in Non-Interlaced-Videos in einem MKV-Container konvertieren, möglicherweise in HEVC.

Ich habe folgende Befehlszeile ausprobiert:

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"

Und ich bekomme die Fehlermeldung:

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!

Wenn ich -vf yadif=1alles entferne, funktioniert es einwandfrei. Ich gehe davon aus, dass ich ffmpeg sagen muss, dass es das Format von der iGPU zurück in den Speicher herunterladen/hochladen/konvertieren muss, damit yadif die Arbeit erledigen und erneut hochladen kann, aber ich habe keine Ahnung, wie das geht.

Antwort1

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"

Andere HW-Beschleunigungen. https://nico-lab.net/combine_hw_decoder_filter_encoder_with_ffmpeg/

Antwort2

Sie können den GPU-beschleunigten vpp_qsvFilter in der Transcodierungskette verwenden. Dessen Verwendung kann wie folgt ausgedruckt werden:

ffmpeg -h filter=vpp_qsv

In Ihrem obigen Fall wäre die Lösung:

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"

Erläuterung:

Für die Videofilterkette siehe ein zusätzliches Argument , extra_hw_frames=64das an übergeben wird hwuploadund von der MFX-Laufzeit benötigt wird, dieerfordert eine feste Rahmenpoolgrößevorab zugewiesen werden. Verwenden Sie eine Nummer, die Ihren Anforderungen entspricht. Im Allgemeinen benötigen Sie eine größere Nummer (64 oder so ungefähr), wenn Sie Funktionen wieVorausschauend (LA-ICQ).

Der zweite Filter in der Kette wird vpp_qsvaufgerufen, um erweitertes Deinterlacing über die Option durchzuführen deinterlace=2. In diesem Ablauf werden die Dekodierung, Transkodierung und Filterung (in diesem Fall der Deinterlacer) alle auf der GPU ausgeführt. Die Option async_depth=4verbessert die Leistung massiv, wie in gezeigtdiese Commit-Nachricht.

Dasist der Grund, warum ich die -lookahead 1Option (vorerst) weggelassen habe. Sollte sich das ändern, werde ich es testen und darüber berichten.

EntsprechendDasCommit, Look-Ahead für den hevc_qsvEncoder-Wrapper erfordert außerdem, dass der erweiterte Bitrate-Steuerungsmodus ebenfalls aktiviert ist. Der vorherige Befehl mit Look-Ahead würde also folgendermaßen aussehen:

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"

Bitte testen und berichten.

Warnung:

Beachten Sie, dass das SDK mindestens 2 Threads benötigt, um Deadlocks zu vermeiden, sieheDasCodeblock.

verwandte Informationen