web-dev-qa-db-fra.com

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

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.

108
Maythux

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
    

    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 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.

110
Maythux

ffmpeg3.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 ffprobename__: 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 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 ffprobeet le nombre total de trames d'entrée avec mediainfocomme 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+ convertone-liner sans fichiers intermédiaires

ffmpegne 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:

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 nodejsname___, npmname__, ffmpeget imagemagickqui sont tous disponibles dans le dépôt.

Une fois que vous avez installé npmname__, 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.

REMARQUE: ffmpeget imagemagickpeuvent nécessiter une compilation avec des bibliothèques spécifiques (libass et fontconfig en conséquence).

11
ccpizza