Unterschied zwischen FFMPEG eq (Helligkeit / Kontrast / Sättigung) und CSS-Filtern?

825
justswim

Ich habe ein Video und versuche, einige CSS-Filter für ein Video mit FFMPEG zu replizieren.

Hier ist ein Screenshot von einem Video in CSS mit der Eigenschaft filter: contrast(150%):

CSS Filtered contrast

Ich habe versucht, diesen Effekt in FFMPEG mit dem EQ-Filter wiederherzustellen und den Kontrast auf 1,5 einzustellen

ffmpeg -y -i ./input.mp4 -vf "eq=contrast=1.5:brightness=0:saturation=1" -pix_fmt yuv420p ./filtered_input.mp4 

Und meine Ausgabe sieht so aus:

enter image description here

Hier ist ein Bild dieser beiden Screenshots nebeneinander:

enter image description here

Sie sehen, dass das linke Bild (gefiltert mit CSS) etwas weißer / blasser ist, wenn Sie den Schnee zwischen den Bildern betrachten.

Hier ist ein Link zum Originalvideo: https://i.imgur.com/dDmp16s.mp4

Ich habe auch diesen Kommentar hier gefunden, der eine Beziehung zwischen Kontrast und Sättigung diskutiert, aber ich habe festgestellt, dass es immer noch einen Unterschied gibt, selbst wenn ich die Sättigung oder nur die Sättigung von selbst eingestellt habe.

Mein Meta-Punkt ist, dass die EQ-Filter von FFMPEG sehr unterschiedliche Ergebnisse von den entsprechenden CSS-Filtern ergeben. Weiß jemand, warum dies passiert und wie ich sie dazu bringen kann, zusammenzupassen?

2

2 Antworten auf die Frage

3
Chungzuwalla

Mein Meta-Punkt ist, dass die EQ-Filter von FFMPEG sehr unterschiedliche Ergebnisse von den entsprechenden CSS-Filtern ergeben. Weiß jemand, warum dies passieren könnte?

Unter allen Softwareanbietern besteht kein einheitlicher Konsens darüber, wie Helligkeit, Kontrast und Sättigung funktionieren sollen.

Die CSS-Filter verfügen über genaue mathematische Definitionen, die vom W3C festgelegt werden. Sie müssen präzise sein, damit verschiedene Browser von verschiedenen Herstellern dasselbe gerenderte Bild anzeigen können. Die aktuelle Spezifikation für CSS-Filter ist hier: https://www.w3.org/TR/filter-effects-1/

Andererseits werden ffmpeg-Filter auf Ad-hoc-Basis von (sehr intelligenten) Ingenieuren implementiert und müssen keinem Standard entsprechen. Sie müssen lediglich aus Sicht der ffmpeg-Entwickler nützlich sein.

und wie kann ich sie dazu bringen, zusammenzupassen?

Ich gehe davon aus, dass der einzige Weg, um genau zu wissen, was ein ffmpeg-Filter tut, darin besteht, den Quellcode zu lesen (mit anderen Worten, der Quellcode ist die Spezifikation). Auf diese Weise können Sie Eingabeparameter bestimmen, die Ihnen das gleiche mathematische Ergebnis liefern wie die CSS-Filter. Oder vielleicht nicht.

Da ffmpeg-Filter keinem Standard entsprechen müssen, besteht das Risiko, dass ein zukünftiges ffmpeg-Update das Ergebnis ändert.

BEARBEITEN : Zu beachten ist auch, dass die numerischen Farbwerte in beiden Videodateien auch dann identisch sind, wenn sie abgespielt werden. Ein Grund ist, dass Metadaten über den Farbraum während der Verarbeitung verloren gingen oder geändert wurden, so dass sich die ffmpeg-Ausgabe in einem anderen Farbraum als das Originalvideo befindet, wodurch der Player die numerischen Farbwerte unterschiedlich interpretiert. Ein anderer Grund ist, wenn ein Spieler Farbraumkonvertierungen unterstützt, die der andere nicht unterstützt. Basierend auf den obigen Screenshots sieht es so aus, als würden sie von verschiedenen Spielern (einem Browser oder etwas anderem) betrachtet. Es ist am besten, beide Videos im selben Player anzuzeigen.

Vielen Dank dafür. Ich wollte CSS-Filter verwenden, um visuelle Echtzeitaktualisierungen für ein Video im Browser bereitzustellen und die Parameter dann zum Rendern an FFMPEG zu senden. Ich habe mit der Abbildung der Werte gespielt, aber es hat nicht funktioniert. Haben Sie Ideen zu anderen Lösungen? Sabba Keynejad vor 6 Jahren 0
Wenn ich dies tun musste, lese ich die CSS-Filterspezifikation unter dem obigen Link, lade die ffmpeg-Quelle herunter und implementiere meinen eigenen ffmpeg-Filter, der die mathematischen Definitionen der CSS-Filter implementierte, die ich für meine Website benötigte. Die Entwicklerdokumentation von ffmpeg erklärt, wie das geht, mit einfachen Vorlagen zum Kopieren und Einfügen. Wenn ich mich besonders wohltätig fühlte, würde ich wahrscheinlich auch den fertigen Filter wieder der ffmpeg-Community anbieten. Chungzuwalla vor 6 Jahren 1
Keine Notwendigkeit, das alles zu tun. Der EQ-Filter hat zwei Routinen, die die Pixeldaten bearbeiten. Eine davon ist mathematisch äquivalent zu CSS, wird jedoch nur aktiviert, wenn der Benutzer einen Ausdruck zum Ändern des Gammawerts liefert. Es ist nur eine Frage des Anwenders, diesen Codepfad frei zu wählen, ohne das Gamma zu verändern. Gyan vor 6 Jahren 0
@Chungzuwalla Vielen Dank. Ich habe eine Problemumgehung gefunden, bei der ich mithilfe eines virtuellen Browsers den CSS-Stil auf das Bild anwenden und es dann erneut als Bild erfassen kann. Ich werde hier einen Post hinzufügen, wenn alles fertig ist, mit einer Dokumentation darüber, wie ich es gemacht habe. Sabba Keynejad vor 6 Jahren 0
0
maxpaj

Aus einem anderen Thread

filter: contrast(c) saturate(s); 

ist äquivalent zu

eq=contrast=c:saturation=c*s 

Nicht sicher über den Helligkeitsparameter.