Wenn ich H.264 mit ffmpeg codiere, erhalte ich massenhaft die folgenden Warnungen:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
Was meinen sie? Ich habe online oder in der ffmpeg-Dokumentation nichts Klares gefunden.
Antworten:
Ich habe Tausende dieser Warnungen mit einer bestimmten Codierung erhalten. Ich habe 1080p-Video auf 480p verkleinert. An einem Bearbeitungspunkt, an dem es aufgrund eines Defekts in der Quell-Laserdisc ein zweifelhaftes Video gab, tauchten diese Meldungen auf und erschienen, glaube ich, für jedes Frame danach. Sie gingen weiter und weiter, wie dieser kurze Auszug:
Der ursprüngliche ffmpeg-Aufruf lautete wie folgt:
Den folgenden Vorschlägen folgend habe ich zuerst -framerate 60000/1001 zum Eingang hinzugefügt. Das hat nichts verbessert. Ich habe -framerate beibehalten und -r 60000/1001 zur Ausgabe hinzugefügt. Das hat noch nichts verbessert. Beibehaltung beider habe ich schließlich -async 1 -vsync 1 hinzugefügt. Dies führte dazu, dass ich eine einzige Warnung erhielt, und das ist alles. Diese Anrufung war:
Der einzige Unterschied, den ich in einem detaillierten Speicherauszug von MediaInfo gefunden habe, war das Entfernen dieser Zeile, die im ursprünglichen Aufruf gefunden wurde, aber nicht im zweiten:
Ich habe jedoch die A / V-Synchronisierung am Anfang der Dateien und am Ende überprüft, und es gab keinen erkennbaren Unterschied in der Synchronisierung zwischen den beiden Dateien. Ihre Laufzeiten waren ebenfalls gleich, aber das wurde in VLC nur auf die nächste Sekunde genau gemessen. Also habe ich die Anzahl der Frames mit ffmpeg wie folgt überprüft:
und suchen Sie nach "frame = #" am Ende der Ausgabe.
Es stellte sich heraus, dass das Quellvideo 375226 Frames lang war, der ursprüngliche Aufruf 375195 Frames ergab und der zweite Aufruf 375200 ergab. Der zweite Aufruf mit erheblich weniger Warnmeldungen ließ also auch 5 Frames weniger fallen.
Nachfolgende Tests zeigten, dass -framerate und -r nicht erforderlich waren und nur die Verwendung der beiden Synchronisierungsflags ausreichend war. Dies führte zu identischen Ergebnissen wie der zweite Aufruf oben. Der dritte und einfachste Aufruf, den ich zur Lösung des Problems gefunden habe, lautet wie folgt:
Und noch eine andere Datei erzeugte später eine Reihe dieser Warnungen, selbst mit den Synchronisierungsflags, aber das Hinzufügen der Ratenflags "reparierte" sie (erzeugte nur zwei statt Tausende von Warnungen). Manchmal funktioniert der zweite Aufruf, wenn der dritte nicht funktioniert. Für meine unmittelbaren Zwecke werde ich mich auf den zweiten Aufruf einigen und hoffe, dass er die meisten dieser Probleme behebt.
Dies war alles mit ffmpeg Version 4.0.
quelle
-async 1 -vsync 1
es für mich behoben.Einer der Betreuer für das DVDStyler Projekt auf Source sagte dies über sie:
quelle
Diese Warnmeldung wird angezeigt, wenn versucht wird, eine Quelle mit hoher Bildrate in eine Ausgabe mit niedriger Bildrate zu codieren. Dies bedeutet, dass Bilder gelöscht werden müssen.
Ich hatte diesen Fehler, weil ich eine Reihe von Bildern in ein Video konvertieren wollte:
Das Problem scheint zu sein, dass, wenn für die Eingabe keine Bildrate angegeben wird, eine Bildrate von 25 fps angenommen wird:
Dies ist auch an der Gesamtzahl der codierten Frames zu erkennen. Ich hatte 400 Bilder, aber der obige Befehl codierte nur 384:
Die Fehlermeldungen werden ausgeblendet, indem stattdessen die Eingabebildrate festgelegt wird, wenn die Ausgabebildrate. Die Ausgabebildrate wird dann automatisch so gewählt, dass sie der Eingabe entspricht. Zusätzlich in neueren Versionen ffmpeg muss man aufpassen, weil , wenn sie mit der PNG - Bildern mit
-i
Option oder vielmehr derimage2
oderv4l2
Eingabeformat, müssen Sie verwenden-framerate
statt-r
, die siehe Dokumentation für die-r
Option .Es ist auch möglich, die Bildrate von Eingabe und Ausgabe separat anzugeben:
In diesem Fall werden nur 161/400 Frames codiert. Die anderen Frames werden zwischenzeitlich gelöscht. Auch die Fehlermeldung verschwindet, ich denke, um ffmpeg nicht durch Spam an stdout zu verlangsamen, siehe:
quelle
-r
dort, wo die Verwendung-framerate
nicht funktioniert hat.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
bis hier ohne weitere Warnungffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(beachten Sie die-framerate 50
für die Eingabe hinzugefügte)Betrachtet man den Quellcode, so scheint es, dass sich der Unterschied zwischen der Präsentationszeit (pts) im Eingabestream von der im Ausgabestream um mehr als einen festen Grenzwert von 0,6 unterscheidet.
Ausschnitte aus der Quelle:
...
Dies ist nur ein kurzer Blick. Sie können also gerne tiefer graben.
quelle
format_video_sync = VSYNC_DROP
oderformat_video_sync = VSYNC_PASSTHROUGH
prüfen, ob eine davon in Ihrem Anwendungsfall realisierbar ist.-r
Schalter "behoben" diese Warnungen.Wie pro FFmpeg Ausgabe # 4700 - Historische Dauer 0,999992 zu groß ist es nur eine Warnung. Verwenden:
Um es zu stoppen.
Ned
quelle
Der Befehl sollte eigentlich sein:
Dem Parameter "quiet" gibt es kein "-" Präfix, da es sich nicht um eine Option handelt, sondern um einen Wert für die Option "-loglevel".
quelle