FFMPEG-Bildverkettung liefert je nach Farbe in der PNG-Datei unterschiedliche Ergebnisse

FFMPEG-Bildverkettung liefert je nach Farbe in der PNG-Datei unterschiedliche Ergebnisse

Ich verwende den folgenden Code, um eine Reihe von PNGs mit unterschiedlicher Dauer aufzunehmen und sie über ein anderes Video zu legen.

ffmpeg  -safe -0 -f concat -i  overlap-png.txt 
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]fps=30[0v];[1v][0v]overlay=0:0"  
-c:v libx264 -profile:v baseline -pix_fmt yuv420p 
-level 3.1 -y  finishedvideo.mp4

Allerdings habe ich etwas sehr Merkwürdiges entdeckt. Die PNG-Dateien, auf die in der TXT-Datei verwiesen wird, sind alle hauptsächlich transparent, mit Ausnahme eines Balkens am unteren Rand, der etwa 300 Pixel groß ist. WENN dieser Balken dunkelgrau ist, funktioniert alles einwandfrei.

Wenn dieser Balken rot ist, wurden viele Bilder oder möglicherweise auch Frames gelöscht.

Außerdem fällt mir auf, dass das Skript unterschiedlich ausgeführt wird, je nachdem, ob der Balken rot oder dunkelgrau ist. Wenn er rot ist, erfolgt mehr zeilenweise Verarbeitung, und wenn er dunkelgrau ist, scheint dieselbe Kodierung in einer Verarbeitungszeile zu erfolgen.

Antwort1

Nicht alle PNGs haben das gleiche Pixelformat. Ich sehe, dass es zwischen RGBA und PAL8 (8-Bit-Palette) wechselt. Wenn ein Input seine Eigenschaften mittendrin ändert, initialisiert ffmpeg die Filter neu. Wenn das passiert, werden alle gepufferten Frames gelöscht.

Ab ffmpeg 4.2 gibt es eine Option, die Neuinitialisierung zu verhindern. In diesem Fall muss das Pixelformat manuell harmonisiert werden. Für ältere Versionen kann eine Zwischenversion mit demselben Pixelformat erstellt werden.

Ab ffmpeg 4.2 können Sie

ffmpeg  -safe 0 -f concat -reinit_filter 0 -i overlap-png.txt 
-i mainvideo.MOV -filter_complex "[1]scale=1920:-1[1v];[0:v]null,format=rgba[0v];[1v][0v]overlay=0:0"  
-c:v libx264 -profile:v baseline -pix_fmt yuv420p 
-level 3.1 -y  finishedvideo.mp4

Bei älteren Versionen erstellen Sie zunächst eine Zwischendatei,

ffmpeg -safe 0 -f concat -i overlap-png.txt -copyts -c:v png -pix_fmt rgba -vsync 0 overlap.mov

und führen Sie dann Ihren ursprünglichen Befehl aus.

verwandte Informationen