FFMPEG: Konvertieren Sie das Video in eine animierte Gif-Vorschau, die Frame für Intervall erhält

1664
andreaem

Ich möchte eine GIF-Vorschau für meine Anwendung erstellen und diese mit FFMPEG auf meinem Server erstellen.

Es sollte ein GIF generiert werden, das 10 Bilder für jedes Video erhält, jedoch ohne ein temporäres Verzeichnis (oder temporäre Dateien, die sich auf jedes Bild beziehen), wenn dies möglich ist.

In Bezug auf diese Antwort auf superuser.com sollte mit jedem Frame ein GIF generiert werden. Dies ist nicht erforderlich.

Scheint seltsam zu sein, aber der Effekt, den ich brauche, ist auf vielen Porno-Websites zu sehen (ich kann mich nicht erinnern, was davon ist).

0

1 Antwort auf die Frage

2
flolilolilo

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

Das Wiki sagt, dass dies -vf "fps=fps=XYZ"Ihre beste Einstellung ist - es wird ein Bild / Frame für jedes Bild XYZdes Originalvideos erstellt. Wenn Sie wirklich 10 Bilder pro Video haben möchten, die alle unterschiedliche Längen haben, können Sie zuerst die Gesamtzahl der Frames auslesen und dann die benötigten fps mit einem Skript berechnen:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid 

mit wanted_frames_times_actual_fpswobei zB 10*25(PAL) oder 10*30(NTSC) in Ihrem Fall und total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff, wo hhStunden bedeutet, mmbedeutet Minuten, ssbedeutet Sekunden und ffbedeutet Rahmen (nach der letzten Sekunde gezählt). Berechnungsbeispiel: Ein Zeitcode von 01:35:45:24(oder 01:35:45.960in FFmpegs Begriffen, da FFmpeg keine Frames, sondern Millisekunden verwendet) mit 25 Frames pro Sekunde entspricht insgesamt 143649 Frames.

Diese Lösung könnte gut funktionieren - Sie müssen nur einen Weg finden, um die Gesamtzeit des Videos (z. B. über ffprobe) und seine fps (wenn Sie keinen richtigen Timecode erhalten) zu erhalten, und diese Informationen dann als Variable mit dem Namen speichern $total_frames_of_vid.


Ich habe in der Wiki-Sektion "Sehen Sie auch" einen anderen Ansatz gefunden, der auf eine Superuser-Frage namens "Meaningful Thumbnails für ein Video mit FFmpeg" verweist, in der Folgendes vorgeschlagen wird :

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 geändert - der Bild-Codec wurde in PNG geändert und die Werte für -frames:vund fpsgeändert. Die Ausgabebilder wurden auch so geändert, dass der Name dreistellig ist.)

und kodieren Sie sie dann erneut in Ihre GIF.

Diese Lösung erfordert auch einige Berechnungen oder manuelle Arbeit, da die Werte aller Optionen (und vor allem fpsje nach Länge des Videos geändert werden müssen). Das heißt, ich habe den Originalcode von Superuser mit einem 35-minütigen Video ausprobiert - und nur 5 Frames daraus gemacht .