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, veuillez donc ne lister que les outils en 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 oeil aux images magick guide pour optimiser gif sur les options que vous pouvez ajouter à la commande de la deuxième étape pour obtenir un fichier plus petit.
ffmpeg
3.4.4 peut le faire directement sur Ubuntu 18.04
Vous voudrez probablement utiliser quelque chose comme:
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
Procédure de génération de données de test décrite sur ce post .
Un plus direct:
Sudo apt-get install ffmpeg
ffmpeg -i in.mp4 out.gif
cela fonctionne également, mais le format de sortie GIF serait bien plus grand que celui de la vidéo en entrée, car les formats vidéo sont compressés intelligemment entre les images.
Rupture d'argument:
ulimit -Sv 1000000
: définissez une taille de mémoire maximale de 1 Go pour le programme.
Généralement, je m'assure que la commande n'utilise pas de mémoire illimitée, contrairement à certaines tentatives précédentes.
500Mo empêche ffmpeg de charger les bibliothèques partagées ... il est temps de mettre à niveau votre RAM?
-ss 00:00:03 -to 00:00:06
: heure de début et de fin de la vidéo.
Non, les GIF ne sont pas le meilleur moyen de pirate distribuer des vidéos en ligne.
Voir aussi: https://stackoverflow.com/questions/18444194/cutting-the-videos-based-on-start-and-end-time-using-ffmpeg
-vf scale=512:-1
: donne la hauteur à 512
en sortie et ajustez la largeur pour conserver le rapport hauteur/largeur.
Il s'agit d'un cas d'utilisation courant pour les images Web, qui ont tendance à avoir une résolution beaucoup plus petite que la vidéo.
Si vous supprimez cette option, le fichier GIF de sortie a la même hauteur que la vidéo d'entrée.
La hauteur vidéo d'origine peut être trouvée par exemple avec ffprobe
name__: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/ 1035178 # 1035178 et vaut 1024 x 1024 dans notre cas.
-r 15
: échantillonnage de FPS.
Par exemple, la vidéo originale faisait 30 images par seconde, donc -r 15
signifie que ffmpeg
choisira une image sur 2 (= 30 / 15
).
Le FPS de sortie perçu est ajusté pour correspondre à l'entrée, de sorte que vous ne remarquerez pas d'accélération, mais seulement une plus grande granularité.
Le FPS d'entrée peut être trouvé avec ffprobe
et le nombre total de trames d'entrée avec mediainfo
comme expliqué à: https://superuser.com/questions/84631/how-di-i-get-get-the -numéro-de-cadres-dans-une-video-sur-la-ligne-de-commande-linux/1044894 # 1044894
Je recommande cette option car les formats vidéo ont généralement un framerate plus élevé en raison de la résolution plus grande. Avec des GIF plus petits, le framerate plus bas est moins perceptible. Nous pouvons donc ignorer certaines images et créer des GIF plus petits.
Avant la version antérieure à 18.04: ffmpeg
+ convert
one-liner sans fichiers intermédiaires
ffmpeg
ne pouvait pas gérer le GIF auparavant. Le meilleur que j'avais était quelque chose de long:
Sudo apt-get install ffmpeg imagemagick
ffmpeg -i input.mp4 -r 10 -f image2pipe -vcodec ppm - | \
convert -delay 5 -loop 0 - output.gif
Explication de certains des arguments:
-loop 0
: ajoute le champ de comptage de boucles de l'extension Netscape Gif à la sortie. 0 signifie boucle infinie, comme décrit à: http://www.vurdalakov.net/misc/gif/netscape-looping-application-extensioneog
name__, firefox
et chromium tout en boucle infiniment par défaut même sans cela, donc je ne suis pas sûr de la nécessité.
-delay 5
: le temps a attendu avant d'afficher l'image suivante, en centièmes de seconde, comme décrit à: https://en.wikipedia.org/wiki/GIF#Animated_GIF octet 324. Donc 100
signifie 1 FPS, 5
signifie 1 / 0.5 == 20FPS
.
Même si vous réduisez la hauteur et le nombre d'images par seconde, il se peut que le format GIF de sortie soit toujours plus grand que la vidéo, car les formats vidéo "réels" non GIF se compressent sur toutes les images, tandis que le format GIF ne compresse que des images individuelles.
Un direct:
convert input.mp4 rpi2-bare-metal-blink.gif
travaillé, mais a presque tué mon ordinateur en raison d’un débordement de mémoire, et a généré une sortie supérieure 100 fois plus grande pour mon fichier d’entrée 2s 1Mb. Peut-être qu'un jour ImageMagick va se rattraper.
Voir aussi: https://superuser.com/questions/556029/how-do-i-convert-a-video-to-gif-using-ffmpeg-with-reasonable-quality
Testé sur Ubuntu 17.10.
gifify est un utilitaire tout-en-un basé sur les nœuds qui simplifie la conversion. Cela dépend de nodejs
name___, npm
name__, ffmpeg
et imagemagick
qui sont tous disponibles dans le dépôt.
Une fois que vous avez installé npm
name__, vous pouvez installer gifify
globalement avec:
npm install -g gifify
Une vidéo peut être convertie en .GIF avec:
gifify video.mp4 -o video.gif
Vous pouvez également éventuellement définir 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!'
❗️ La conversion peut prendre plusieurs minutes, même avec des vidéos plus petites.
REMARQUE:
ffmpeg
etimagemagick
peuvent nécessiter une compilation avec des bibliothèques spécifiques (libass et fontconfig en conséquence).