Ich möchte .gif
aus einem .mp4
Video eine Animation machen . Ich würde es vorziehen, es von der Kommandozeile aus zu tun, also bitte nur Kommandozeilen-Tools auflisten.
Ich möchte .gif
aus einem .mp4
Video eine Animation machen . Ich würde es vorziehen, es von der Kommandozeile aus zu tun, also bitte nur Kommandozeilen-Tools auflisten.
Antworten:
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 512
Hö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 15
bedeutet, dass ffmpeg
alle 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 ffprobe
und 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
+ convert
Einzeiler ohne Zwischenfeilen
ffmpeg
konnte 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:
-loop 0
: Füge das Netscape Gif Extension Loop Count Feld zur Ausgabe hinzu. 0 bedeutet Endlosschleife, wie beschrieben unter: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extension eog
, firefox
und Chrom schleift standardmäßig unendlich, auch ohne, daher bin ich mir nicht sicher, wie notwendig es ist ist mehr.
-delay 5
: Wartezeit vor dem Anzeigen des nächsten Frames in Hundertstelsekunden, wie beschrieben unter: https://en.wikipedia.org/wiki/GIF#Animated_GIF Byte 324. Das 100
bedeutet also 1 FPS, 5
bedeutet 1 / 0.5 == 20FPS
.
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.
scale=320:-1
-r 10
wird das GIF auf die normale Geschwindigkeit zurückgesetzt.
Zwei schritte:
Extrahieren Sie Bilder aus Video
Erstellen Sie ein Verzeichnis mit dem Namen frames im selben Verzeichnis wie Ihre .mp4
Datei. 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
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.
frames
Ordner vorhanden sein muss, damit der erste Befehl ausgeführt werden kann.
-layers Optimize
den letzten convert
Befehl 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
ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'
.
gifify ist ein All-in-One-Dienstprogramm, das die Konvertierung vereinfacht. Es hängt davon ab nodejs
, npm
, ffmpeg
, und imagemagick
die in der repos alle zur Verfügung stehen.
Sobald Sie npm
installiert haben, können Sie gifify
global 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:
ffmpeg
und müssenimagemagick
möglicherweise mit bestimmten Bibliotheken kompiliert werden (z. B. libass und fontconfig entsprechend).
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 install
und ob sie als root ausgeführt werden sollen oder nicht? Vielen Dank!