Was bedeutet "Vergangene Dauer X.XXX zu groß"?

142

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.

Erik
quelle
2
Bitte richten Sie die ffmpeg-Fragen an video.stackexchange.com beta. Siehe die Beschreibung des ffmpeg-Tags.
Ondra Žižka
34
@Ondra Noch ein Stapelaustausch? Ich bin verwirrt mit diesen über 100 Unterwebsites. Ich bin mir nicht sicher, ob dies eine positive Richtung ist, in die sich Stackexchange bewegt.
mxmlnkn
1
@mxmlnkn Ich stimme zu, es macht Sie sehnen sich nach einfacheren Zeiten ... :)
Erik
4
Ich halte es für. StackOverflow dient zur Programmierung, dies ist keine Programmierung. Es gibt eine Q & A-Site für die Videoverarbeitung. Dies ist eine Frage zur Videoverarbeitung. Was ist nicht zu verstehen?
Ondra Žižka
Lesen Sie auch die Tag-Beschreibung.
Ondra Žižka

Antworten:

23

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:

Past duration 0.901115 too large=  535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 31 times
Past duration 0.901115 too large=  535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 34 times
Past duration 0.901115 too large=  535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 36 times
Past duration 0.901115 too large=  535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 39 times

Der ursprüngliche ffmpeg-Aufruf lautete wie folgt:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv

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:

ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1

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:

Delay relative to video                  : -33ms

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:

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

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:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1

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.

Larryy
quelle
2
Danke dafür! Nach Tagen voller Probleme wurde -async 1 -vsync 1es für mich behoben.
Offek
1
Vielen Dank für diese Analyse @larryy sehr hilfreich
deepelement
90

Einer der Betreuer für das DVDStyler Projekt auf Source sagte dies über sie:

FFMpeg-Versionen nach dem 15. Januar 2015 zeigen diese Warnung häufig an. Es wurde hinzugefügt, um vor möglichen Verzerrungen der Ratensteuerung zu warnen, da es sonst keinen Schaden verursacht.

Josh Davis
quelle
'Rate Control Distortion' bezieht sich auf (hauptsächlich Video-) Codierung und hat keinen Bezug zu dieser Warnung, bei der es darum geht, ob sich der Ausgabezeitstempel (relativ) zu stark vom Eingabezeitstempel unterscheidet
Gyan
Die ersten Male, als ich die Warnung erhielt, habe ich die Konvertierung abgebrochen, aber dieser Rat hat mich dazu gebracht, sie laufen zu lassen, und die Warnungen wurden nach einer Weile gestoppt und die Konvertierung wurde erfolgreich abgeschlossen. Vielen Dank.
IRTFM
58

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:

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

Das Problem scheint zu sein, dass, wenn für die Eingabe keine Bildrate angegeben wird, eine Bildrate von 25 fps angenommen wird:

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

Dies ist auch an der Gesamtzahl der codierten Frames zu erkennen. Ich hatte 400 Bilder, aber der obige Befehl codierte nur 384:

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

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 -iOption oder vielmehr der image2oder v4l2Eingabeformat, müssen Sie verwenden -frameratestatt -r, die siehe Dokumentation für die -rOption .

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

Es ist auch möglich, die Bildrate von Eingabe und Ausgabe separat anzugeben:

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

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:

mxmlnkn
quelle
3
"Denn nur wenn Sie PNG-Bilder mit der Option -i verwenden, müssen Sie -framerate anstelle von -r verwenden" - dies hat mein Problem vollständig gelöst, danke!
Anonym
1
Beim Versuch, eine WMV in MP4 umzuwandeln, funktionierte die Verwendung -rdort, wo die Verwendung -frameratenicht funktioniert hat.
1934286
+1 und ich schlage vor, Ihre "Zusammenfassung" nach oben zu verschieben. Mehr noch, da es meinen Fall gelöst hat, Bilder in Videos umzuwandeln und zu versuchen, die Framerate der Ausgabe zu erhöhen und auch die Ausgabe zu beschleunigen. Ich begann von hier 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 Warnung ffmpeg -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 50für die Eingabe hinzugefügte)
el-teedee
49

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:

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) {
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) {
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
        } else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    }

Dies ist nur ein kurzer Blick. Sie können also gerne tiefer graben.

Erik
quelle
Können wir irgendetwas tun, um dieses Problem zu "beheben" oder die Ausgabepunkte explizit festzulegen?
Baodad
1
Ich erinnere mich nicht an die Details zu diesem Problem, aber wenn Sie mit "Beheben" die Warnung loswerden möchten, können Sie anhand des obigen Codes die Option prüfen format_video_sync = VSYNC_DROPoder format_video_sync = VSYNC_PASSTHROUGHprüfen, ob eine davon in Ihrem Anwendungsfall realisierbar ist.
Erik
Vielen Dank. Ich fand die Einstellung der Bildrate explizit mit dem -rSchalter "behoben" diese Warnungen.
Baodad
1
Nur etwas aus persönlicher Erfahrung: Ich hatte das Spam-Problem "vergangene Dauer" und habe dieses Problem behoben, indem ich die Eingangsbildrate mit -r 25 erzwungen habe, aber dann fing ich an, das Audio stark aus der Synchronisation zu bringen. Das Entfernen der Option -r und die Verwendung von "-async 1 -vsync 1" zum Verhindern von Audio-Desync hat das Audioproblem verhindert, aber der Spam "vergangene Dauer" scheint ebenfalls verschwunden zu sein.
Jason Lang
In Version 4.1 und höher wurde die Protokollebene aktualisiert, sodass sie nicht auf der Standardprotokollebene angezeigt wird.
Gyan
1

Der Befehl sollte eigentlich sein:

ffmpeg -loglevel quiet -i input_file.xyz ...

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".

Gordon McCrae
quelle