Wie kann man RGB-Farbe so weit wie möglich beibehalten? Eine Reihe von PNG-Dateien in einen Videocontainer mit ffmpeg konvertieren?

634
amn

Ich habe 950 PNG-Dateien, die in einer 38-Sekunden-Videospur zu 25 Bildern pro Sekunde zu Einzelbildern werden sollen. Die Dateinamen sind bis auf die Folgenummer identisch, wie es in solchen Fällen üblich ist.

Ich möchte einen Container mit einem breit unterstützten Format erstellen, idealerweise WebM, wenn alle Kriterien erfüllt werden können, oder MPEG-4, beispielsweise mit einem Codec, der von modernen Browsern für die Wiedergabe unterstützt wird, aus dieser Serie von PNG-Bildern I haben. Das Problem ist, dass die Farben verschoben werden und die Hintergrundfarbe im decodierten Video nicht mehr mit dem gleichen RGB-Triplett übereinstimmt, das in den PNG-Bildern von der Hintergrundfarbe abgetastet wurde. Dies führt dazu, dass das Video auf meiner HTML-Seite, auf der das Video eingebettet ist, aus dem vorgesehenen Hintergrund herausragt.

Ich habe das einfache probiert:

ffmpeg -f image2 -i image%03d.png output.webm

Das gab mir eine VP9-Videospur von 25 fps, die in einen WebM-Container gepackt war.

Bei den PNG-Bildern handelt es sich um einen Animationsstil mit festem Hintergrund und einfachen Formen, die für den Vordergrund animiert werden. Sie scheinen farblich nicht markiert zu sein (das sagt mir Adobe Bridge. Ich gehe davon aus, dass dies kein eingebettetes Farbprofil oder einen Verweis auf ein Profil bedeutet). Das Problem bei meinem obigen Versuch ist, dass, obwohl der Container in Chrome wiedergegeben wird, die Hintergrundfarbe des PNG-Bildes mit RGB-Triplet #ED4D56nicht mit der Hintergrundfarbe übereinstimmt, die im wiedergegebenen Video angezeigt wird.

Ist dies ein unvermeidlicher Nebeneffekt der Konvertierung von RGB in YUV (Kodierung) in RGB (Wiedergabe)? Gibt es eine Möglichkeit, dies zu mildern? Ich behaupte nicht, dass die Frames in der Videospur mit RGB codiert werden. Ich nehme an, YUV ist in Ordnung, solange ein moderner Browser, der diese Frames wiedergibt, das gleiche (innerhalb eines vernachlässigbaren Fehlerbereichs) RGB-Triplett erzeugt, wenn das Decodiert und angezeigt wird Rahmen (s).

Meine Frage ist, welche Befehlszeile ffmpegkann ich verwenden, um dies zu mildern? Ich bin offen für das Umschalten des Videocodecs, des Pixelformats, das Aktivieren des Farbmanagements in ffmpeg, falls vorhanden, usw.

1
Wie wurden die PNGs generiert? Irgendwelche spezifischen Farbeigenschaften? Gyan vor 6 Jahren 0
Generiert mit After Effects. Wenn ich Sie richtig verstehe, fallen mir keine spezifischen Farbeigenschaften ein - die Bilder integrieren kein Farbprofil und sind nur RGB-Bilder ohne Tag. amn vor 6 Jahren 0
Ich hatte zuvor einen Kommentar darüber, dass PNGs kein Profil halten können, was eigentlich falsch war. Deshalb habe ich es gelöscht. PNGs, die von Photoshop gespeichert wurden, können jedoch keine eingebetteten Profile enthalten, obwohl die Datei ** technisch ein Profil enthalten kann. Würde mich nicht wundern, wenn AE ähnlich wäre. Ich würde beim Export nach sRGB konvertieren und sehen, ob das funktioniert. Tetsujin vor 6 Jahren 0

1 Antwort auf die Frage

0
semyonfilippov

Ich hatte kürzlich eine sehr ähnliche Aufgabe und ich würde sagen, dass es immer noch keine perfekte Lösung gibt (Stand Oktober 2018). Dies ist der Nebeneffekt der Farbumwandlung von RGB nach YUV in RGB mit niedriger Genauigkeit. Selbst einige "verlustfreie" libvpx-vp9 -losslessCodec- Varianten (z. B. ) erzeugen aufgrund des YUV-Farbraums verzerrte Farben.

  • Wenn nicht exakte Farben akzeptabel sind, kann der libvpx- Codec einen guten Job machen:

    ffmpeg -r 25 -i image%03d.png -c:v libvpx -crf 4 -b:v 0 output.webm 

    Mit diesen Einstellungen wurde eine geringfügige Farbverschiebung oder sogar die exakten Farben für einige Framesets erzeugt. VPx-Codecs werden weitgehend unterstützt (alle gängigen Browser außer IE und Safari) und erzeugen eine angemessene Dateigröße.

  • Wenn die exakten Farben unbedingt erforderlich sind, müssen wir die Farbraumkonvertierung vermeiden. Die einzige Cross-Browser-Lösung, die ich entwickelt habe, ist die Verwendung von animierten PNG- Bildern. ffmpeghat nur eine sehr grundlegende Unterstützung für apng, daher ist es besser andere Tools zu verwenden, zB apngasm:

    apngasm output.png image001.png 1 25 

    es funktioniert überall außer IE und Edge (dort wird es zu einem statischen ersten Frame zurückfallen). Die Dateigrößen sind riesig, aber das ist der Preis für die wirklich verlustfreie Kodierung.

  • Der libx264rgb Codec sollte auch erwähnt werden, - mit ihm wird die richtige Art und Weise der Codierung, die genauen RGB - Farben sein, wenn / falls Browsern unterstützt.