[Tuto] Créer des gifs animés de qualité à partir d'une vidéo

l’Almanet doLys Gnu/Linux – Open Source – Entreprises Forums L’almanet doLys Open Source [Tuto] Créer des gifs animés de qualité à partir d'une vidéo

Ce sujet a 5 réponses, 3 participants et a été mis à jour par jlfh0816 jlfh0816, il y a 3 mois et 1 semaine.

6 sujets de 1 à 6 (sur un total de 6)
  • Auteur
    Messages
  • #2975
    jlfh0816
    jlfh0816
    Modérateur

    Créer des Gifs animés de qualité à partir d’une vidéo

    combinedgimp
    exemple de gif animé “amélioré” créé à partir de deux captures d’écran enregistrées avec Kazam (taille finale inférieure à 2 Mo)

    L’autre jour, en voulant uploader des GIFS animés sur un site, je me suis heurté à deux problèmes pratiques :
    – la limitation de la taille des fichiers uploadés (par exemple, elle est fixée à 2 Mo chez dolys.fr);
    – et, par conséquent, la mauvaise qualité du rendu visuel lorsque ce fichier est un GIF animé.

    Après avoir parcouru le net à la recherche d’astuces qui me permettraient de contourner ces limitations, je suis tombé sur deux articles très intéressants :
    high quality gif with ffmpeg (blog.pkh.me)

    how do I convert a video to gif using ffmpeg with reasonable quality (superuser)

    Les solutions proposées par les auteurs ont l’air très performantes. Comme je n’ai pas l’impression qu’elles soient très connues et surtout comme elles m’ont bien rendu service pour agrémenter un précédent tutoriel, j’ai pensé faire œuvre utile en leur faisant un peu de publicité.

    En ce concerne la taille des gifs créés avec la nouvelle méthode, j’ai pu constater que certains sont de taille plus petite que les gifs créés avec la méthode classique. C’est par exemple le cas pour celui créé à partir de ma vidéo personnelle ci-dessous. Par contre, ça n’est pas le cas pour le gif créé à partir du dessin animé Big Buck Bunny montré à la fin de ce tuto. J’ignore bien pourquoi ….

    En tout cas, vous pouvez juger ci-dessous par vous-même de la différence de rendu visuel et de fluidité entre les deux types de GIF, c’est flagrant (regardez le ciel par exemple) :

    le même GIF animé créé avec la méthode “classique” (en haut) et avec la méthode “améliorée” (en bas)

    Pour illustrer mon propos, je vais partir d’une vidéo d’origine personnelle (pour éviter d’éventuels problèmes de droits d’auteur, on ne sait jamais …) et j’utiliserai FFMPEG (version 7:3.2.0) pour la manipulation de la vidéo et la création des gifs.

    La vidéo a été réalisée avec un appareil photo numérique Nikon D3300. Elle s’appelle “source.MOV” et fait 178 Mo pour une durée de 64 secondes.

    Mon objectif est de créer des gifs animés 320×180 pixels à partir de cette vidéo puis de comparer leur qualité visuelle selon que l’on utilise la méthode « classique » ou la méthode « améliorée ».

    Pour chaque méthode envisagée, il y aura deux sous-cas à envisager :
    – soit le gif doit contenir l’intégralité de la vidéo (64 secondes) ;
    – soit la taille du gif ne doit pas dépasser 2 Mo.

    Dans le premier cas, c’est la taille du gif qui sera la variable d’ajustement puisque la durée est fixée à 64 secondes.
    Dans le second cas, c’est la durée du gif qui sera la variable d’ajustement puisque sa taille est fixée à 2 Mo maximum.

    Préambule

    Avant de rédiger ce petit tuto, j’ai essayé de voir si la conversion préalable de source.MOV vers source.mp4 a une influence ou non sur la taille finale des GIFs.
    Pour la conversion, j’ai utilisé la ligne de commande suivante :

    ffmpeg -i /home/jlfh0816/Vidéos/source.MOV -vcodec libx264 /home/jlfh0816/Vidéos/source.mp4

    Et c’est ainsi que d’un fichier source.MOV faisant 178 Mo, je suis passé à un fichier source.mp4 ne faisant plus que 117 Mo.
    Et bien, en dépit de cette cure d’amaigrissement, les GIFs animés créés (en 320×180 pixels et contenant la totalité de la vidéo) ont des tailles quasi-identiques :
    – 28,7 Mo pour celui généré à partir de source.MOV;
    – 28,5 Mo pour celui généré à partir de source.mp4.
    Mais bon, le format .mp4 étant nettement plus répandu (par exemple, pour des captures d’écran réalisées avec Kazam), j’utiliserai systématiquement source.mp4 comme fichier vidéo de départ tout au long de ce tuto.

    Création d’un GIF animé, méthode «classique»

    A) gif contenant toute la vidéo

    ffmpeg -i /home/jlfh0816/Vidéos/source.mp4 -s 320x180 /home/jlfh0816/Vidéos/final.gif

    Résultat: le GIF “classique” obtenu fait 28,5 Mo (il contient les 64 secondes de la vidéo source).
    B) gif d’une partie de la vidéo seulement
    Dans ce cas de figure, la taille du gif est arbitrairement fixée à 2 Mo maximum et c’est donc la durée du gif qui va devoir s’adapter pour rester en-dessous de 2 Mo.
    Pour que le gif atteigne sa taille idéale, voici comment j’ai fait :
    – j’ai ignoré les 10 premières secondes du fichier source.MOV (sans regrets, elles m’intéressaient moins). Ceci n’a rien d’obligatoire, c’est seulement pour indiquer à ffmpeg à partir de quel moment de la vidéo on souhaite que le gif soit généré. Si vous voulez que le gif démarre en même temps que la vidéo, vous remplacez 10 par 0 ;
    – j’ai exécuté plusieurs fois la ligne de commande ci-dessous en faisant à chaque fois varier l’argument -t (en secondes) jusqu’à ce que la taille finale du gif frôle la barre fatidique des 2 Mo.
    Mes tâtonnements successifs m’ont montré que, pour des dimensions de 320×180 pixels, final.gif ne doit pas durer plus de 4,5 secondes (attention : dans la ligne de commande, c’est de l’anglais donc il faudra remplacer la virgule de 4,5 par un point).
    Ce qui donne la ligne de commande suivante:

    ffmpeg -y -ss 10 -t 4.5 -i /home/jlfh0816/Vidéos/source.mp4 -s 320x180 /home/jlfh0816/Vidéos/final.gif

    Résultat: le GIF”classique” obtenu fait moins de 2 Mo (très exactement 1 988 079 octets) pour une durée de 4,5 secondes. Il joue donc les 4,5 premières secondes situées à partir de la dixième seconde de source.mp4. Et il est de qualité tout à fait honorable pour un GIF “classique”.

    Création d’un GIF animé, méthode «améliorée»

    A) gif contenant toute la vidéo
    Avec cette méthode, il faut procéder en deux étapes successives :
    étape 1 : génération d’une palette de couleurs

    ffmpeg -y -i /home/jlfh0816/Vidéos/source.mp4 -vf fps=10,scale=320:-1:flags=lanczos,palettegen /home/jlfh0816/Vidéos/palette.png

    étape 2 : génération du GIF animé «amélioré»

    ffmpeg -i /home/jlfh0816/Vidéos/source.mp4 -i /home/jlfh0816/Vidéos/palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" /home/jlfh0816/Vidéos/final.gif

    Résultat: le GIF animé “amélioré” obtenu fait 26,1 Mo (il contient les 64 secondes de la vidéo source).
    B) gif d’une partie de la vidéo seulement
    L’objectif étant d’obtenir un GIF “amélioré” pesant moins de 2 Mo, il va falloir là-aussi déterminer de façon empirique la durée idéale du gif adaptée à cette taille maximale. Comme au paragraphe 1, j’ai procédé de la façon suivante :
    – mise à l’écart des 10 premières secondes de la vidéo source ;
    – essais successifs des lignes de commandes ci-dessous en faisant varier à chaque fois la valeur (en secondes) de l’argument -t.
    Mes tâtonnements successifs m’ont montré que, pour des dimensions inchangées de 320×180 pixels, final.gif ne doit durer que 4,8 secondes.
    Ce qui donne les 2 étapes suivantes:
    . étape 1 : génération de la palette

    ffmpeg -y -ss 10 -t 4.8 -i /home/jlfh0816/Vidéos/source.mp4 -vf fps=10,scale=320:-1:flags=lanczos,palettegen /home/jlfh0816/Vidéos/palette.png

    . étape 2 : génération du GIF animé «amélioré»

    ffmpeg -ss 10 -t 4.8 -i /home/jlfh0816/Vidéos/source.mp4 -i /home/jlfh0816/Vidéos/palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" /home/jlfh0816/Vidéos/final.gif

    Résultat: le GIF animé “amélioré” obtenu fait effectivement moins de 2 Mo, très exactement 1 996 387 octets (ça y est, il peut être uploadé sur le site dolys.fr de nam1962 !).
    Ce gif «amélioré» dure un tout petit plus longtemps que le gif «classique» mais surtout son rendu visuel est bien meilleur.

    Conclusion :

    Il est maintenant facile d’obtenir des GIFs animés de qualité nettement améliorée par rapport aux GIFs classiques.
    Volià qui devrait faciliter la vie de tous ceux qui ont besoin d’utiliser ces animations pour illustrer ou agrémenter leurs propos dans des présentations, des blogs, un site, etc …
    Il serait sans doute plus pratique d’avoir recours à un script pour concaténer les deux étapes (création de la palette puis génération du gif) mais c’est au-delà de mes compétences. Mais si quelqu’un veut bien se pencher sur la question, j’en serai très heureux.
    Et pour terminer, voici un autre exemple d’un même gif créé selon les deux méthodes. Vous l’aurez reconnu, il s’agit d’un extrait du dessin animé Big Buck Bunny (2008), dessin animé sous licence Creative commons (© copyright 2008, Blender Foundation, http://www.bigbuckbunny.org) :

    finalbbbclassique finalbbbameliore
    le même GIF animé créé avec la méthode “classique” (en haut) et avec la méthode “améliorée” (en bas)

    Bons GIFs animés !

    Xubuntu-Voyager 14.04.5 LTS et Xubuntu-Voyager 16.04 LTS

    #2976
    RedJ
    RedJ
    Participant

    Ho! Merci! Il me tarde d’essayer cette procédure!
    Tenter la chose en ligne de commande, en plus!
    Merci-Merci!
    (J’ai des décennies de graphisme dans le corps, [c’est Aldus Page Maker qui m’y a introduit (v. 5.1)]
    et je ne suis sous Linux qu depuis un an… (le Mac m’aura fait perdre bien du temp [?])
    Merci de communiquer ce type d’infos!


    ? Ce n'est pas parce que c'est ainsi que c'est comme çà!

    RedJ

    #2977
    jlfh0816
    jlfh0816
    Modérateur

    @redj
    Merci beaucoup de ton commentaire, j’espère que cette méthode (que j’ai vraiment découvert par hasard !) te sera utile.

    Xubuntu-Voyager 14.04.5 LTS et Xubuntu-Voyager 16.04 LTS

    #2979

    kholo
    Participant

    salut,
    je commence le script en bash ;
    juste des fonctions pour commencer !

    function Mp42Gifplus {
    # VARIABLES
    # pour la partie 1	PALETTE="/home/jlfh0816/Vidéos/palette.png"	FPS=10	SCALE=320	FLAGS='lanczos'
    # pour la partie 2	FILER_COMPLEX="fps=$FPS,scale=$SCALE:-1:flags=lanczos[x];[x][1:v]paletteuse"
    # étape 1 : génération d’une palette de couleurs
    # ffmpeg -y -i /home/jlfh0816/Vidéos/source.mp4 -vf fps=10,scale=320:-1:flags=lanczos,palettegen /home/jlfh0816/Vidéos/palette.png	ffmpeg -y -i $SOURCE -vf fps=$FPS,scale=$SCALE:-1:flags=$FLAGS,palettegen $PALETTE
    # étape 2 : génération du GIF animé «amélioré»
    # ffmpeg -i /home/jlfh0816/Vidéos/source.mp4 -i /home/jlfh0816/Vidéos/palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" /home/jlfh0816/Vidéos/final.gif	ffmpeg -i $SOURCE -i $PALETTE -filter_complex $FILER_COMPLEX $DESTINATION
    # étape 3 : supprimer la palette ?	# rm $PALETTE
    }

    pour les autres ça donne ça :

    function Mov2Mp4 {	# ffmpeg -i /home/jlfh0816/Vidéos/source.MOV -vcodec libx264 /home/jlfh0816/Vidéos/source.mp4	ffmpeg -i $SOURCE -vcodec libx264 $DESTINATION
    }
    function Mp42Gifclassique {
    # Création d’un GIF animé, méthode «classique»
    # A) gif contenant toute la vidéo
    # ffmpeg -i /home/jlfh0816/Vidéos/source.mp4 -s 320x180 /home/jlfh0816/Vidéos/final.gif
    ffmpeg -i $SOURCE -s $RESOLUTION $DESTINATION
    }
    function Mp42Gif2classique {
    # B) gif d’une partie de la vidéo seulement
    # Dans ce cas de figure,
    # la taille du gif est arbitrairement fixée à 2 Mo maximum
    # et c’est donc la durée du gif qui va devoir s’adapter pour rester en-dessous de 2 Mo.
    # Si vous voulez que le gif démarre en même temps que la vidéo, vous remplacez 10 par 0 ;
    # DEBUT en secondes depuis le début de la vidéo originale
    # DUREE
    ffmpeg -y -ss $DEBUT -t $DUREE -i $SOURCE -s $RESOLUTION $DESTINATION
    }
    #2980
    jlfh0816
    jlfh0816
    Modérateur

    @kholo
    Un grand merci de ton travail pour le script en bash. Je dois t’avouer que je suis une bille pour beaucoup de choses en informatique (ce n’est pas du tout ma branche professionnelle, hélas) et notamment pour l’écriture de scripts. Si bien que ton travail est par avance accueilli bras ouverts !
    Encore merci, je regarderai tout cela ce week-end à tête reposée

    Xubuntu-Voyager 14.04.5 LTS et Xubuntu-Voyager 16.04 LTS

    #3117
    jlfh0816
    jlfh0816
    Modérateur

    @kholo
    Excuse-moi de revenir vers toi aux nouvelles mais l’idée qu’une personne compétente se penche sur l’écriture d’un script m’a emballé : est-ce que tu as pu avancer dans la réalisation de ton script ?
    Dans l’attente de te lire, je te souhaite de très bonnes fêtes de fin d’année !
    Amicalement,

    Xubuntu-Voyager 14.04.5 LTS et Xubuntu-Voyager 16.04 LTS

6 sujets de 1 à 6 (sur un total de 6)

Vous devez être connecté pour répondre à ce sujet.