FFMPEG: Video in animiertes GIF konvertieren. Vorschau erhält Frame nach Intervall

FFMPEG: Video in animiertes GIF konvertieren. Vorschau erhält Frame nach Intervall

Ich möchte eine GIF-Vorschau für meine Anwendung generieren und habe sie mit FFMPEG auf meinem Server erstellt.

Es sollte ein GIF mit 10 Einzelbildern für jedes Video generiert werden, jedoch wenn möglich ohne Verwendung eines temporären Verzeichnisses (oder temporärer Dateien, die sich auf die einzelnen Einzelbilder beziehen).

Zu dieser Antwort aufsuperuser.com, es sollte mit jedem Frame ein GIF generiert werden, das ist nicht, was ich brauche.

Es scheint seltsam, aber der Effekt, den ich brauche, ist etwas, das man auf vielen Porno-Websites sehen kann (ich weiß nicht mehr, auf welchen davon).

Antwort1

Wenn ich dich richtig verstehe,dieser Artikel im FFmpeg-Wiki mit dem Titel „Alle X Sekunden ein Miniaturbild des Videos erstellen“zeigt, dass FFmpeg nicht das tun kann, was Sie möchten (ohne einige automatisierte Berechnungen).

Laut Wiki -vf "fps=fps=XYZ"ist das die beste Lösung – es wird für jedes Einzelbild des Originalvideos ein Miniaturbild/Einzelbild erstellt XYZ. Wenn Sie wirklich 10 Bilder pro Video möchten und diese alle unterschiedliche Längen haben, können Sie zuerst die Gesamtzahl der Einzelbilder auslesen und dann die benötigten Bilder pro Sekunde mit einem Skript berechnen:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

wobei in Ihrem Fall z. B. (PAL) oder (NTSC) wanted_frames_times_actual_fpsist und , wobei Stunden bedeutet, Minuten bedeutet, Sekunden bedeutet und Frames (nach der letzten gezählten Sekunde) bedeutet.10*2510*30total_frames_of_vid=(hh*3600+mm*60+ss)*25+ffhhmmssffBerechnungsbeispiel: Ein Zeitcode von 01:35:45:24(oder 01:35:45.960in FFmpeg-Begriffen, da FFmpeg keine Frames, sondern Millisekunden verwendet) bei 25 Bildern pro Sekunde ähnelt insgesamt 143649 Bildern.

Diese Lösung könnte gut funktionieren – Sie müssen lediglich eine Möglichkeit finden, die Gesamtzeit des Videos (z. B. über ffprobe) und seine fps (wenn Sie keinen richtigen Zeitcode erhalten können) zu ermitteln und diese Informationen dann als Variable mit dem Namen zu speichern $total_frames_of_vid.


Einen weiteren Ansatz hierzu habe ich im Abschnitt "Siehe auch" des Wikis gefunden, mit einem Link zu eine Superuser-Frage mit dem Titel „Aussagekräftige Thumbnails für ein Video mit FFmpeg“was die Verwendung von Folgendem nahelegt:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(Ich habe den Code ein wenig modifiziert – den Bildcodec auf PNG geändert und die Werte für -frames:vund geändert fps. Außerdem habe ich die Ausgabebilder so geändert, dass ihre Namen drei Ziffern haben.)

und kodieren Sie sie dann neu in Ihr GIF.

Diese Lösung erfordert auch einige Berechnungen oder Handarbeit, da die Werte aller Optionen (und insbesondere) fpsentsprechend der Länge des Videos geändert werden müssen. Ich habe beispielsweise den Originalcode vom Superuser mit einem 35-minütigen Video ausprobiert – und nur 5 Frames daraus erhalten.

verwandte Informationen