![Probleme mit der hardwarebeschleunigten Kodierung von ffmpeg und yadif](https://rvso.com/image/1615251/Probleme%20mit%20der%20hardwarebeschleunigten%20Kodierung%20von%20ffmpeg%20und%20yadif.png)
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=1
alles 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_qsv
Filter 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=64
das an übergeben wird hwupload
und 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_qsv
aufgerufen, 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=4
verbessert die Leistung massiv, wie in gezeigtdiese Commit-Nachricht.
Dasist der Grund, warum ich die -lookahead 1
Option (vorerst) weggelassen habe. Sollte sich das ändern, werde ich es testen und darüber berichten.
EntsprechendDasCommit, Look-Ahead für den hevc_qsv
Encoder-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.