Filterkette in FFMPEG

Dom-Salas

Newbie
Registriert
Jan. 2025
Beiträge
2
Hallo Zusammen,

evtl. befindet sich ja ein Experte unter euch, der mir bei meinem Problem helfen kann...
Ich reencodiere mittels FFMPEG TS-Streams eines Linux-Receivers, die ich skaliere und auch sonst nachbearbeite. Gamma-Änderungen, Farbsättigung und Nachschärfungen mittels Unscharfmaskieren. Außerdem wird das Senderlogo mit dem delogo-Filter entfernt.
Das Ganze geschieht unter staxrip. Zum Reencodieren verwende ich meine RTX4060TI, um es möglichst schnell - aber trotzdem in hinreichender Qualität - über die Bühne zu bringen.
Die von mir verwendete Filterkette hat bis vor Kurzem funktioniert. Mit der aktuellen Version erhalte ich einen Fehler, ffmpeg fügt wohl in die Bearbeitungskette weitere Hilfsfilter ein, die zum Abbruch führen. Ich habe verschiedene Aufrufvarianten getestet und den Filtergraphen versucht zu beeinflussen. Das hat jedoch nicht geklappt. Evtl. hat ja unter euch jemand eine Idee, wie ich mein Problem gelöst bekomme. Nachfolgend die Kommandozeile zum Aufruf von ffmpeg:
-hwaccel_output_format cuda -c:v h264_nvenc -profile:v high -v verbose -vf yadif,delogo=x=44:y=70:w=158:h=75,delogo=x=20:y=77:w=87:h=20,eq=gamma=0.91:saturation=1.5,crop=1908:1074:6:4,scale=1704x960:flags=lanczos,unsharp=3:3:2 -preset p6 -tune hq -rc vbr -rc-lookahead 32 -spatial-aq 1 -temporal-aq 1 -coder cabac -refs 2 -bf 4 -b_ref_mode middle -b:v 4000k

Der Fehler äußert sich so:
[graph -1 input from stream 0:0 @ 000002616b157cc0] w:1920 h:1080 pixfmt:cuda tb:1/90000 fr:25/1 sar:1/1 csp:bt709 range:tv
[auto_scale_0 @ 000002616b157dc0] w:iw h:ih flags:'' interl:0
[Parsed_yadif_0 @ 000002614aef83c0] auto-inserting filter 'auto_scale_0' between the filter 'graph -1 input from stream 0:0' and the filter 'Parsed_yadif_0'
Impossible to convert between the formats supported by the filter 'graph -1 input from stream 0:0' and the filter 'auto_scale_0'
[vf#0:0 @ 00000261495a4440] Error reinitializing filters!
[vf#0:0 @ 00000261495a4440] Task finished with error code: -40 (Function not implemented)
[vf#0:0 @ 00000261495a4440] Terminating thread with return code -40 (Function not implemented)

Hat jemand eine Idee, wieso ffmpeg da aussteigt?
 
Mit meiner selbst kompilierten Version (git-2024-11-08) bekomme ich bei diesem Befehl keine Fehlermeldung:

Code:
ffmpeg -hide_banner -hwaccel_output_format cuda \
    -i input.mp4 \
    -vf yadif,delogo=x=44:y=70:w=158:h=75,delogo=x=20:y=77:w=87:h=20,eq=gamma=0.91:saturation=1.5,crop=1908:1074:6:4,scale=1704x960:flags=lanczos,unsharp=3:3:2 \
    -c:v h264_nvenc -f null -

Da du nicht explizit zwischen den Formaten konvertierst, muss ffmpeg selber versuchen das zu tun, und das scheint bei dir zu scheitern, wie du ja auch selbst geschrieben hast.

Du könntest noch mal eine neuere ffmpeg version versuchen, und dann mit möglichst wenig Parametern ans Ziel vortasten. Oder du fügst selbst Filter hinzu die das konvertieren der HW/SW Formaten bewerkstelligen.
Einige der Filter die du verwendest haben übrigens auch HW Versionen, damit könntest du theoretisch noch weiter optimieren. Allerdings braucht es dazu auch Helfer wie hwupload/hwdownload etc.
 
Bin etwas spät, da ich nur sporadisch ans Testen gekommen bin. Job war stressig...
Mittlerweile habe ich die Lösung gefunden...! User bin/bash hat mich auf die richtige Spur gebracht. Meine neuen Parameter und die Filterkette sehen so aus:
-hwaccel dxva2 -c:v h264_nvenc -profile high -cq 26 -threads 8 -v verbose -vf yadif,delogo=x=<x-wert>:y=<y-wert>:w=<w-wert>:h=<h-wert>:enable='between(n,5000,6440)',crop=1920:1080:4:4,scale=1280x720:flags=lanczos,eq=gamma=0.98:saturation=1.3,unsharp=3:3:2 -preset p6 -tune hq -rc vbr -rc-lookahead 32 -spatial-aq 1 -temporal-aq 1 -coder cabac -refs 2 -bf 4 -b_ref_mode middle
Ich lasse immer noch ffmpeg entscheiden, wie es die Filterkette zur Laufzeit aufpimpen will.
Der Knackpunkt war tatsächlich von cuda auf dxva2 zu wechseln. Das beschleunigt genauso gut, benötigt aber mehr Resourcen vom Prozessor. Waren unter cuda die 16 Kerne zu max. 15% ausgelastet, sind es unter dxva2 bis zu 40%. Das kann aber auch an der unterschiedlichen Filterkette liegen, wie diese die CPU fordert.
Die Performance stellt mich auch zufrieden. Die 720p-Codierung läuft mit über 400fps ab. Das ist deutlich fixer als nur die CPU alleine.
Vielen Dank für eure Hinweise...!:)
 
Zurück
Oben