Konvertieren von RGB-Bildern in verlustfreies Video mit avconv / ffmpeg

5745
despens

Ich versuche, eine Serie von PNG24-Bildern, die eine Bildschirmanimation enthalten, in ein verlustfreies Video zu konvertieren, so dass jedes Pixel genau so wiedergegeben wird, wie es im Original war. Avconv (und ffmpeg) liefern jedoch dieselben, unbefriedigenden Ergebnisse, die auf eine fehlerhafte Kolonialisierung zurückzuführen sind.

Dies ist die Version von avconv, die ich verwende:

avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:02:36 with gcc 4.6.3 

Jedes der Bilder ist 1280 × 800 Pixel groß. Sie enthalten keine fotografischen Motive, sondern speziell gewürfelte Muster.

Ich habe den qtrleCodec verwendet, da es sich anscheinend um einen verlustfreien Codec handelt, der wie animierte GIFs oder animierte PNGs funktioniert. Bei der Konvertierung in Video scheint es jedoch zu einer Farbraumkonvertierung ("Filter") zu kommen, die die Pixel durcheinander bringt.

Dies ist die avconv-Ausgabe:

$ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers built on Apr 2 2013 17:02:36 with gcc 4.6.3 Input #0, image2, from 'frames.png/wth-%08d.png': Duration: 00:11:17.96, start: 0.000000, bitrate: N/A Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc File 'qtrle-30fps-rgb.mov' already exists. Overwrite ? [y/N] y [buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra [avsink @ 0x742ac0] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out' [scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4 Output #0, mov, to 'qtrle-30fps-rgb.mov': Metadata: encoder : Lavf53.21.1 Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc Stream mapping: Stream #0:0 -> #0:0 (png -> qtrle) Press ctrl-c to stop encoding frame= 450 fps= 22 q=0.0 Lsize= 126056kB time=15.00 bitrate=68843.4kbits/s  video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441% 

Dies ist eine ursprüngliche PNG-Bilddatei:

enter image description here

Dies ist ein Screenshot des Videos, das abgespielt wird:

Screenshot of the video being replayed

Bitte beachten Sie, dass Sie diese Bilder in ihrer ursprünglichen Auflösung von 1280 × 800 sehen müssen, um die Unterschiede zu erkennen.

Hier ist ein Vergleich nebeneinander, wobei das linke Bild das Original und das rechte das Ergebnis nach der Videocodierung ist:

enter image description here

Gibt es eine Möglichkeit, aus einer Reihe von PNGs eine wirklich verlustfreie, pixelgenaue Videodatei zu erstellen?

2
Interessant. Ihre Eingabedatei wird als "bgra" angezeigt, während sie für mich (in "ffmpeg") als "rgba" angezeigt wird. Können Sie trotzdem versuchen, die Ausgabe auf `-pix_fmt argb` zu setzen? slhck vor 10 Jahren 0
Ich habe argb ausprobiert, das Ergebnis sieht genauso aus wie zuvor. vor 10 Jahren 0
Hallo @slhck, ausgehend von Ihrem Kommentar habe ich versucht, das Format der PNGs so zu ändern, dass kein automatischer Filter erforderlich ist. Ich habe in ImageMagick die Option -flatten + matte verwendet, um echte RGB24-Png-Dateien zu erhalten. Das Ergebnis war, dass ** kein Filter 'automatisch eingefügt' wurde **, aber das Ergebnis war immer noch falsch. Jetzt frage ich mich, wie man den 'Encoder' ändert: 'Lavf53.21.1'? vor 10 Jahren 0
Der Encoder ist im Wesentlichen das, was in `avconv` (oder` ffmpeg`, wenn Sie FFmpeg verwenden) eingebaut ist. Sie können es nur ändern, indem Sie eine neuere Version verwenden. Meines Wissens bietet Libav keine Builds von `avconv` an, also müsstest du dich selbst bauen. Oder laden Sie eine statische Version von `ffmpeg` von der Download-Seite (http://ffmpeg.org/download.html) herunter. Bitte beachten Sie den Unterschied zwischen Libav und FFmpeg: [Wer kann mir den Unterschied und die Beziehung zwischen ffmpeg, libav und avconv mitteilen?] (Http://stackoverflow.com/questions/9477115/who-can-tell-me-the-difference -and-beziehung-zwischen-ffmpeg-libav-und-avconv) slhck vor 10 Jahren 0
Wenn Sie dies jedoch mit einem kürzlich erstellten Build reproduzieren können, sollten Sie einen Fehlerbericht mit FFmpeg oder Libav erstellen, wenn Sie das Gefühl haben, dass die Farbkonvertierung nicht exakt ist (obwohl dies der Fall sein sollte). slhck vor 10 Jahren 0

2 Antworten auf die Frage

2
despens

Mit Hilfe eines ffmpeg-Teilnehmers wurde festgestellt, dass sowohl ffmpeg als auch libav fehlerfreie, verlustfreie Quicktime-Dateien erstellen. Das Problem scheint der Grafikkartentreiber zu sein, der die Videos falsch darstellt (da GStream-basierte Player und VLC beide falsch anzeigen, VLC jedoch perfekte PNGs von Videoframes exportiert). Wenn Sie überprüfen möchten, ob ein Video die Frames wirklich Pixel für Pixel enthält, versuchen Sie es mit

$ ffmpeg -i input.png -vcodec qtrle out.mov  $ ffmpeg -i input.png -f framecrc - $ ffmpeg -i out.mov -f framecrc - 

Dies gibt Frame-Daten-Prüfsummen aus.

Konvertieren Sie das verlustfreie Video für einen visuellen Vergleich wieder in Einzelbilder und vergleichen Sie diese.

Abhängig von den Codecs müssen Sie möglicherweise `-pix_fmt` verwenden, um dieselbe Anordnung verlustfrei dekodierter Daten zu erstellen. Der RGB-h.264-Decoder von ffmpeg gibt beispielsweise planares RGB aus. ffmpeg ruft "gbrp" auf. Peter Cordes vor 9 Jahren 0
0
Peter Cordes

Ich habe eine längere Antwort zu folgenden Themen gepostet: So erstellen Sie ein unkomprimiertes AVI aus einer Serie von 1000 PNG-Bildern mit FFMPEG

vcodec libx264rgbmit -preset ultrafast -qp 0, oder utvideo.