Je veux créer un .gif
animé à partir d'une vidéo .mp4
. Je préférerais le faire à partir de la ligne de commande, alors s'il vous plaît ne lister que les outils de ligne de commande.
Deux étapes:
Extraire des images de la vidéo
Créez un répertoire appelé frames dans le même répertoire avec votre fichier .mp4
.
Utilisez la commande:
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
Vous allez vous retrouver avec un fichier assez volumineux, jetez un coup d’œil au guide d’image magick pour optimiser gif sur options que vous pouvez ajouter à la deuxième commande pour obtenir un fichier plus petit.
ffmpeg
+ convert
one-liner sans fichiers intermédiaires
sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
convert -delay 5 -loop 0 - output.gif
produit la sortie rapidement et avec une taille raisonnable par rapport à celle du fichier d'entrée.
Source: lien
Explication de certains arguments:
-r 10
: échantillonnage des FPS. Par exemple, si la vidéo d'origine contenait 30 images par seconde, -r 10
signifie que ffmpeg
choisira une image sur trois. Le nombre d'images par seconde peut être trouvé avec ffprobe
et le nombre total de trames d'entrée peut être trouvé avec mediainfo
comme expliqué à: lien Une valeur relativement faible comme 10
signifie moins de trames de sortie, et donc des GIF plus petits. TODO certains
-loop 0
: ajoute le champ Nombre de boucles de l'extension Netscape Gif à la sortie. 0 signifie boucle infinie comme décrit à: lien eog
, firefox
et chrome tous bouclent infiniment par défaut même sans elle, donc je ne suis plus sûr de la nécessité.
-delay 5
: le temps d'attente avant l'affichage de l'image suivante, en centièmes de seconde, comme décrit à: lien octet 324. Ainsi, 100
signifie 1 FPS, 5
signifie 1 / 0.5 == 20FPS
.
Autres arguments facultatifs que vous souhaiterez probablement:
ffmpeg -vf scale=320:-1
: rend la sortie 320
pixels en hauteur. Ceci est un cas d'utilisation courant pour les GIF pour le Web. Si vous supprimez cette option, le fichier GIF de sortie a la même hauteur que la vidéo d'entrée. La hauteur d'origine peut être trouvée par exemple avec ffprobe
: lien et la sortie avec identify
.
ffmpeg -ss 00:02:26 -to 00:02:36
: convertit la vidéo de 02 minutes 26 secondes à 02 minutes 36 secondes. Voir aussi: lien
Même si vous réduisez la hauteur et le framerate, le GIF de sortie peut encore être plus grand que la vidéo, puisque les "vrais" formats vidéo non-GIF compressent les images, tandis que GIF ne compresse que les images individuelles.
Un direct:
convert input.mp4 rpi2-bare-metal-blink.gif
a fonctionné, mais a presque tué mon ordinateur en raison d'un débordement de mémoire, et a produit une sortie 100 fois plus grande pour mon fichier d'entrée 2s 1Mb. Peut-être qu'un jour, ImageMagick va rattraper son retard.
Testé sur Ubuntu 17.10.
gifify est un utilitaire tout-en-un qui simplifie la conversion. Cela dépend de nodejs
, npm
, ffmpeg
et imagemagick
qui sont tous disponibles dans les repos.
Une fois npm
installé, vous pouvez installer gifify
globalement avec:
npm install -g gifify
Une vidéo peut être convertie en une .GIF avec:
gifify video.mp4 -o video.gif
Vous pouvez également définir éventuellement une position de début et de fin dans la vidéo et ajouter une légende de texte:
gifify clip.mp4 -o clip.gif --from 01:48:23.200 --to 01:48:25.300 --text 'we are the knights who say nip!'
conversion La conversion peut prendre plusieurs minutes, même avec des vidéos plus petites.
REMARQUE:
ffmpeg
etimagemagick
devront peut-être être compilés avec des bibliothèques spécifiques (libass et fontconfig en conséquence).
Lire d'autres questions sur les étiquettes command-line mp4 gif