Wie erstelle ich ein animiertes GIF aus MP4-Video über die Befehlszeile?

119

Ich möchte .gifaus einem .mp4Video eine Animation machen . Ich würde es vorziehen, es von der Kommandozeile aus zu tun, also bitte nur Kommandozeilen-Tools auflisten.

Maythux
quelle
Sie können dieses Skript auf Github verwenden , das FFMPEG verwendet und eine Zwischenfarbpalette für eine bessere Bildqualität generiert.
Troyane

Antworten:

128

ffmpeg 3.4.4 kann es direkt auf Ubuntu 18.04 machen

Sie möchten wahrscheinlich Folgendes verwenden:

sudo apt-get install ffmpeg
wget -O opengl-rotating-triangle.mp4 https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.mp4?raw=true
ulimit -Sv 1000000
ffmpeg \
  -i opengl-rotating-triangle.mp4 \
  -r 15 \
  -vf scale=512:-1 \
  -ss 00:00:03 -to 00:00:06 \
  opengl-rotating-triangle.gif

Testdatengenerierungsverfahren in diesem Beitrag beschrieben .

Ein direkter:

sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif

funktioniert auch, aber das ausgegebene GIF wäre viel größer als das eingegebene Video, da Videoformate intelligent über Frames hinweg komprimiert werden.

Aufschlüsselung der Argumente:

  • ulimit -Sv 1000000: Stellen Sie eine maximale Speichergröße von 1 GB für das Programm ein.

    Meistens stelle ich sicher, dass der Befehl nicht wie bei früheren Versuchen unbegrenzten Speicher belegt.

    Mit 500 MB kann ffmpeg keine gemeinsam genutzten Bibliotheken laden.

  • -ss 00:00:03 -to 00:00:06: Start- und Endzeit, von der aus das Video geschnitten werden soll.

    Nein, GIFs sind nicht der beste Weg , um Piraten Videos verteilen online.

    Siehe auch: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg

  • -vf scale=512:-1: Legt die 512Höhe der Ausgabepixel fest und passt die Breite an, um das Seitenverhältnis beizubehalten.

    Dies ist ein häufiger Anwendungsfall für Bilder für das Web, die in der Regel eine viel geringere Auflösung als Videos haben.

    Wenn Sie diese Option entfernen, hat das ausgegebene GIF die gleiche Höhe wie das eingegebene Video.

    Die Original - Video Höhe kann mit zum Beispiel gefunden werden ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 und ist 1024 x 1024 in unserem Fall.

  • -r 15: Abtastung FPS.

    Das Originalvideo hatte beispielsweise 30 FPS. Das -r 15bedeutet, dass ffmpegalle 2 Bilder ein Einzelbild ausgewählt werden ( = 30 / 15).

    Die wahrgenommene Ausgabefrequenz wird jedoch an die Eingabe angepasst, sodass Sie keine Beschleunigung bemerken, sondern nur eine größere Granularität.

    Die Eingangs-FPS finden Sie mit ffprobeund die Gesamtzahl der Eingangs-Frames finden Sie mit mediainfo: https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-einem-video-auf-der-linux-befehlszeile / 1044894 # 1044894

    Ich empfehle diese Option, da Videoformate aufgrund der höheren Auflösung normalerweise eine höhere Bildrate haben. Bei kleineren GIFs fällt die niedrigere Framerate weniger auf, sodass wir einige Frames überspringen und kleinere GIFs erstellen können.

Vor dem 18.04 .: ffmpeg+ convertEinzeiler ohne Zwischenfeilen

ffmpegkonnte zuvor nicht mit GIF umgehen. Das Beste, was ich hatte, war etwas zusammen:

sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
  convert -delay 5 -loop 0 - output.gif

Erklärung einiger Argumente:

Selbst wenn Sie die Höhe und Bildrate verringern, ist das ausgegebene GIF möglicherweise immer noch größer als das Video, da "echte" Nicht-GIF-Videoformate über Frames hinweg komprimiert werden, während GIF nur einzelne Frames komprimiert.

Eine direkte:

convert input.mp4 rpi2-bare-metal-blink.gif

hat funktioniert, aber fast meinen Computer wegen Speicherüberlaufs getötet und einen 100-mal größeren Output für meine 2s 1Mb-Eingabedatei erzeugt. Vielleicht holt ImageMagick eines Tages auf.

Siehe auch: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality

Getestet unter Ubuntu 17.10.

Ciro Santilli ist ein Schauspieler
quelle
1
Downvoter erklären bitte ;-)
Ciro Santilli am
1
Ihre Verzögerung stimmt nicht mit Ihrem -r-Wert überein (das resultierende GIF ist 2x Geschwindigkeit). Außerdem haben Sie ohne ersichtlichen Grund ein Skalenargument hinzugefügt (wodurch das GIF wirklich klein wird).
Asmeurer
2
Genau. Kleine Gifs sind besser für das Web. Vielen Dank für scale=320:-1
zombic
2
Für diejenigen, die sich fragen: Durch Entfernen -r 10wird das GIF auf die normale Geschwindigkeit zurückgesetzt.
Mitch
2
Ich habe ein 20% größeres GIF als das mp4: O
Adam Goldman
113

Zwei schritte:

  • Extrahieren Sie Bilder aus Video

    Erstellen Sie ein Verzeichnis mit dem Namen frames im selben Verzeichnis wie Ihre .mp4Datei. Befehl verwenden:

    ffmpeg -i video.mp4  -r 5 'frames/frame-%03d.jpg'
    


    -r 5 stands for FPS value
        for better quality choose bigger number
        adjust the value with the -delay in 2nd step
        to keep the same animation speed
    
    %03d gives sequential filename number in decimal form
    

    Quelle

  • Bilder in GIF konvertieren

    cd frames
    convert -delay 20 -loop 0 *.jpg myimage.gif
    


    -delay 20 means the time between each frame is 0.2 seconds
       which match 5 fps above.
       When choosing this value
           1 = 100 fps
           2 = 50 fps
           4 = 25 fps
           5 = 20 fps
           10 = 10 fps
           20 = 5 fps
           25 = 4 fps
           50 = 2 fps
           100 = 1 fps
           in general 100/delay = fps
    
    -loop 0 means repeat forever
    

    Docs: Konvertiere GIF-Optionen

Sie werden am Ende eine ziemlich große Datei haben. Sehen Sie sich die Anleitung zur Bildbearbeitung an, um die GIF- Optionen zu optimieren , die Sie zum Befehl für den zweiten Schritt hinzufügen können, um eine kleinere Datei zu erhalten.

Maythux
quelle
1
große Antwort- einige zusätzliche Informationen: ffmpeg können Richtungen installiert werden hier
chepyle
3
Denken Sie daran, dass der framesOrdner vorhanden sein muss, damit der erste Befehl ausgeführt werden kann.
Totymedli
3
Für diejenigen, die einen schnellen Weg zur Optimierung suchen, der im Allgemeinen funktioniert und zu faul ist, um den Link zu lesen, fügen Sie einfach -layers Optimizeden letzten convertBefehl hinzu *.jpg. Überprüfen Sie die Ausgabe, es könnte jedoch betroffen sein. Für mich hat es die GIF-Größe von 5 MB auf 700 KB reduziert, ohne
erkennbaren
Danke, das war ein interessanter Prozess. Ein 5,6-MB-mp4-Bild hat ein 236-MB-Gif ergeben. Ich bin mir nicht sicher, ob ich das auf meiner Website veröffentlichen werde.
Kardamom
2
Anstatt das JPG-Dateiformat zu verwenden, das mit den Standardeinstellungen sehr verlustbehaftet ist, würde ich empfehlen, PNG für den anfänglichen Dateiexport zu verwenden. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F
12

gifify ist ein All-in-One-Dienstprogramm, das die Konvertierung vereinfacht. Es hängt davon ab nodejs, npm, ffmpeg, und imagemagickdie in der repos alle zur Verfügung stehen.

Sobald Sie npminstalliert haben, können Sie gififyglobal installieren mit:

    npm install -g gifify

Ein Video kann in ein .GIF konvertiert werden mit:

    gifify video.mp4 -o video.gif

Optional können Sie auch eine Start- und Endposition im Video festlegen und eine Textbeschriftung hinzufügen:

    gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'

❗️ Es kann einige Minuten dauern, bis die Konvertierung auch bei kleineren Videos abgeschlossen ist.

HINWEIS: ffmpegund müssen imagemagickmöglicherweise mit bestimmten Bibliotheken kompiliert werden (z. B. libass und fontconfig entsprechend).

ccpizza
quelle
Bewältigt keine Clips von mehr als 40 Sekunden: github.com/vvo/gifify/issues/99
oligofren
19.04: Ein anderes erforderliches Paket ist gifsicle, aber dann tritt ein anderes Problem auf: github.com/vvo/gifify/issues/95 Würden Sie uns auch gerne mitteilen , welche Verzeichnisse npm novices ausführen sollen npm installund ob sie als root ausgeführt werden sollen oder nicht? Vielen Dank!
Nicolas Raoul