Beim Konvertieren einer GIF in ein Video wird die Dauer geändert

1087
Aminesrine

Ich möchte eine GIF-Datei mit ffmpeg in ein Video konvertieren. Ich benutze:

ffmpeg -y -i /gif/583fd7661b46d.gif -strict -2 -an -b:v 32M /gif/mp4/583fd7661b46d.avi 

Die Dauer meines Gifs in Photoshop beträgt 27 Sekunden, aber die Dauer des erzeugten Videos "583fd7661b46d.avi" beträgt 15 Sekunden. Wie kann ich die gleiche Dauer meines Gifs im Video erzeugen?

4
Wie genau ist das Ergebnis verzerrt? Werden unterschiedliche Verzögerungen gleich oder verändern sie sich proportional zu dem, was sie sein sollten? ivan_pozdeev vor 7 Jahren 0
Laut http://stackoverflow.com/a/24724126/648265 sollten aktuelle Versionen von `ffmpeg` die in der GIF angegebenen Verzögerungen berücksichtigen. ivan_pozdeev vor 7 Jahren 0
Ich habe GIF mit 21 Sekunden und das Video mit 24 Sekunden generiert, auch GIF mit 27s und das Video mit 15s. Ich habe keinen proportionalen Anteil !! Ich verwende "ffmpeg version N-80901-gfebc862 Copyright (c) 2000-2016 die mit gcc 4.8 (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) erstellten FFmpeg-Entwickler" Welche Version sollte ich verwenden? Aminesrine vor 7 Jahren 0
Das beantwortet nicht die Frage "Wie genau ist das Ergebnis verzerrt?". Okay, ich formuliere es mit einfachen Worten. Wie unterscheidet sich das Video vom GIF? Welche Änderungen führen zu einer anderen Dauer? ivan_pozdeev vor 7 Jahren 0
Ich sehe keinen Unterschied in der Geschwindigkeit. Es gibt ein Beispiel für das GIF und das erzeugte Video: https://drive.google.com/open?id=0B-6RrqcLpcp9NzhWWlgta1NTZlk Aminesrine vor 7 Jahren 0

2 Antworten auf die Frage

3
ivan_pozdeev

Anhand Ihres Beispiels habe ich das Problem identifiziert:

In Ihrer GIF hat der letzte (leere) Frame eine Dauer von 10370ms. Es scheint ignoriert zu werden ffmpeg, den Unterschied hervorzurufen.

Wenn ich das Ausgabeformat in ändere .mp4, wird die Dauer korrekt. Das Ändern des Encoders hat keine Auswirkungen.

Das ist also ein Fehler ffmpeg. Dies könnte zu einer Begrenzung des Ausgabeformates zurückzuführen sein, was sehr unwahrscheinlich ist (das Problem ist auch für .mkv), aber in diesem Fall sollte es eine Warnung zumindest drucken. Beim Durchsehen ihres Bug-Trackers fand ich # 4235 (Konvertieren von GIF in MP4 mit FFmpeg erzeugt ein Video, das nicht den GIF-Frame-Timings entspricht.) - Das Aussehen war für das .mp4Format behoben, für andere jedoch nicht.

Für das OP besteht die Lösung darin, zuerst auf MP4 auszugeben und dann als AVI neu zu formatieren, wenn dies das endgültige Format ist. Gyan vor 7 Jahren 0
[Einen Fehlerbericht eingereicht] (https://trac.ffmpeg.org/ticket/6000). ivan_pozdeev vor 7 Jahren 0
Lösung ist bereits vorhanden - fügen Sie "-vsync cfr" bei der Ausgabe in avi oder mkv / webm hinzu. Gyan vor 7 Jahren 2
@ Mulvya ja, aber es ist ein Workaround, keine Lösung. Der ursprüngliche Frameset wird vollständig zerstört und durch eine Sequenz mit konstanter Framerate ersetzt. Es ist also nur gut, wenn Sie ein Format mit konstanter Bildrate ausgeben. Die richtige Lösung wäre die Verwendung eines "End-of-Stream-Markers" für Diashowformate. ivan_pozdeev vor 7 Jahren 0
AVIs unterstützen nur CFR und haben keine Zeitstempel, so dass ihre Bilddauer mit dem Kehrwert der Bildrate berechnet wird. Um das Äquivalent von VFR in AVI zu erzeugen, müssen Sie eine hohe Framerate festlegen, die dem Kehrwert des kleinsten Intervalls zwischen Frames entspricht, und dann für längere Intervalle 0-Byte-Blöcke schreiben. Es gibt sowieso keine "reine Lösung" für die OP-Ausgabe. Gyan vor 7 Jahren 0
@ Mulvya der Punkt ist, dass ein Wechsel nicht erforderlich sein sollte, Slideshow-Streams sollten unabhängig davon korrekt interpretiert werden. Das "Endstück" des Streams nach der letzten Folie zu ignorieren ist definitiv nicht das richtige Verhalten. ivan_pozdeev vor 7 Jahren 0
0
Pavlus

Wenden Sie einfach den Präsentationszeitstempel-Filter mit einem Koeffizienten an, der original time / achieved timein Ihrem Fall dem Bruch entspricht - 27/15. Sie fügen also -filter:v "setpts=27/15*PTS"vor dem Namen der Ausgabedatei einen Filter hinzu .

Weitere Informationen zu Änderungen der Frameraten im FFmpeg-Wiki finden Sie unter: https://trac.ffmpeg.org/wiki/How%20to%20speed%20up%20/%20slow%20down%20a%20video

Aber ich kenne die 15 und 27 Werte nicht genau. Ich möchte ein GIF in ein Video mit gleicher Dauer konvertieren, ohne einen Wert zu kennen Aminesrine vor 7 Jahren 1
Wenn Sie Ihre GIF-Framerate kennen (Sie produzieren sie, oder?), Können Sie Ihre Video-Framerate entsprechend anpassen. Um die Videodauer zu erhalten, verwenden Sie `ffprobe`: http://superuser.com/a/945604/318118 Pavlus vor 7 Jahren 0
Ich importiere die GIF-Datei von meiner Schnittstelle. Dann sollte ich den ffmpeg-Befehl ausführen, damit das Video dieser GIF-Datei mit der gleichen Dauer entspricht. Gibt es eine Möglichkeit, die Dauer meines Gifs mit PHP zu bekommen? Aminesrine vor 7 Jahren 0
Sie können ffprobe über `shell_exec` aufrufen. Schauen Sie sich auch das PHP-FFmpeg-Projekt https://github.com/PHP-FFMpeg/PHP-FFMpeg an. Es ist ein PHP-Wrapper für FFmpeg. Pavlus vor 7 Jahren 0
Ich führe das aus: "ffprobe -i /gif/584020787a1b7.gif -show_format | grep duration", aber das Ergebnis ist "duration = N / A". Aminesrine vor 7 Jahren 0
Kann keine Dauer bekommen? Warum nicht FPS finden?! `ffprobe -v 0 -select_streams v -print_format flat -show_entries stream = r_frame_rate. / 4.gif` gibt etwas im Format` streams.stream.0.r_frame_rate = "30/1" aus. Es gibt mehrere Ausgabeformate Sie mögen: https://ffmpeg.org/ffprobe.html#Writers Pavlus vor 7 Jahren 1
Wie kann ich die frame_rate meines gif im ffmpeg-Befehl verwenden, um ein Video mit derselben Dauer zu haben? Aminesrine vor 7 Jahren 0
Verwenden Sie es, um die Framerate für die Ausgabe festzulegen. Wenn Sie immer noch eine falsche Zeit erhalten - lassen Sie den Benutzer den PTS-Koeffizienten ändern. Da GIF keine Frame-Zeitstempel und keine Verzögerung für jedes Frame besitzt, ist die Wiedergabezeit in der Regel schwierig und systemabhängig. Die Konvertierung in Video erfordert daher eine Benutzerinteraktion oder ein tiefes Verständnis der Videocodierungstechniken. Pavlus vor 7 Jahren 0
Für mein Gif: streams.stream.0.r_frame_rate = "100/3". Also führe ich das aus: "ffmpeg -y -i gif / 584020787a1b7.gif -strict -2 -an -b: v 32M -r 100/3 /gif/mp4/583fd7661b46d_new_.avi" Aber es erzeugt ein Video mit 15 Sekunden der Dauer Aminesrine vor 7 Jahren 0