Comment créer un GIF animé à partir d'une vidéo MP4 via une ligne de commande?


119

Je veux faire une animation à .gifpartir d'une .mp4vidéo. Je préférerais le faire à partir de la ligne de commande, veuillez donc ne lister que les outils en ligne de commande.


Vous pouvez utiliser ce script sur Github qui utilise FFMPEG et génère une palette de couleurs intermédiaire pour une meilleure qualité d'image.
Troyane

Réponses:


128

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

fonctionne également, mais le format de sortie GIF serait bien plus grand que la vidéo en entrée, car les formats vidéo se compressent 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 pour couper la vidéo.

    Non, les GIF ne sont pas le meilleur moyen de pirater 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: crée les 512pixels de sortie en hauteur et ajuste 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 initiale peut être trouvée par exemple avec ffprobe: https://superuser.com/questions/595177/how-to-retrieve-video-file-information-from-command-line-under-linux/1035178#1035178 et est 1024 x 1024 dans notre cas.

  • -r 15: échantillonnage FPS.

    Par exemple, la vidéo originale faisait 30 images par seconde, ce -r 15qui signifie qu’elle ffmpegchoisira 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 peut être trouvé mediainfocomme expliqué à l' adresse suivante : https://superuser.com/questions/84631/how-do-i-get-the-number-of-frames -in-une-video-sur-la-ligne-de-linux-commande / 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 visible, nous pouvons donc ignorer certaines images et créer des GIF plus petits.

Avant le 18.04: ffmpeg+ convertone-liner sans fichiers intermédiaires

ffmpegne pouvait pas gérer le format 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:

Même si vous réduisez la hauteur et le nombre d'images par seconde, il se peut que le fichier GIF en sortie soit plus volumineux 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.


1
Voyageurs à la baisse s'il vous plaît expliquer ;-)
Ciro Santilli a annoncé le

1
Votre délai ne correspond pas à votre valeur -r (le gif résultant est 2x vitesse). Vous avez également ajouté un argument scale sans raison apparente (le gif est donc vraiment petit).
Asmeurer

2
Je suis d'accord. Les gifs de petite taille sont meilleurs pour le Web. Merci pour scale=320:-1
zombic

2
Pour ceux qui se demandent: le retirer -r 10ramènera le GIF à une vitesse normale.
Mitch

2
J'ai un gif 20% plus gros que le mp4: O
Adam Goldman

113

Deux étapes:

  • Extraire des images de la vidéo

    Créez un répertoire appelé frames dans le même répertoire avec votre .mp4fichier. 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
    

    la source

  • Convertir les images en gif

    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: options de conversion gif

Vous obtiendrez un fichier assez volumineux. Consultez le guide des images magiques pour optimiser les options de gif on que vous pouvez ajouter à la commande de la deuxième étape pour obtenir un fichier plus petit.


1
excellente réponse - quelques informations supplémentaires: ffmpeg peut être installé à l'aide des instructions
fournies

3
N'oubliez pas que le framesdossier doit exister pour que la première commande fonctionne.
Totymedli

3
Pour ceux qui veulent un moyen rapide d’optimisation qui fonctionne généralement et qui sont trop paresseux pour lire le lien, il suffit d’ajouter -layers Optimizeà la dernière convertcommande, avant *.jpg. Vérifiez la sortie si, il pourrait être affecté. Pour moi, il a réduit la taille de gif de 5 Mo à 700 Ko sans perte perceptible de qualité :)
cpury

Merci, c’était un processus intéressant, un MP4 de 5,6 Mo a été transformé en un fichier gif de 236 Mo. Je ne suis pas sûr que je le publierai sur mon site Web.
cardamome

2
Au lieu d'utiliser le format de fichier JPG, qui entraîne des pertes importantes avec les paramètres par défaut, je vous recommande d'utiliser le format PNG pour l'exportation de fichier initiale. ffmpeg -i video.mp4 -r 5 'frames/frame-%03d.png'.
Pierre F

12

gifify est un utilitaire tout-en-un basé sur les nœuds qui simplifie la conversion. Cela dépend nodejs, npm, ffmpeget imagemagickqui sont tous disponibles dans les prises en pension.

Une fois que vous avez npminstallé, vous pouvez installer gififyglobalement 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.

NOTE: ffmpeget imagemagickdevra peut-être être compilé avec certaines bibliothèques spécifiques (ie libass et fontconfig en conséquence).


Ne gère pas environ> 40 secondes de clips: github.com/vvo/gifify/issues/99
oligofren

19.04: Un autre package requis est gifsicle, mais un autre problème se produit: github.com/vvo/gifify/issues/95 De plus, cela vous dérangerait-il de nous dire à npm novices dans quel répertoire doit être exécuté npm installet s'il faut l'exécuter en tant que root ou pas? Merci!
Nicolas Raoul
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.