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 contient 11 réponses, 6 participants et a été mis à jour pour la dernière fois par RiQ, le il y a 4 années et 6 mois.
-
AuteurArticles
-
novembre 23, 2016 à 7:31 pm #2975jlfh0816Modérateur
Créer des Gifs animés de qualité à partir d’une vidéo
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) :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 !
[dkpdf-button]
Xubuntu-Voyager 18.04.4 LTS
novembre 23, 2016 à 10:52 pm #2976RedJParticipantHo! 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!novembre 24, 2016 à 7:37 am #2977jlfh0816Modé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 18.04.4 LTS
novembre 24, 2016 à 1:00 pm #2979kholoParticipantsalut,
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 }
novembre 24, 2016 à 4:05 pm #2980jlfh0816Modé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éeXubuntu-Voyager 18.04.4 LTS
décembre 18, 2016 à 8:18 pm #3117jlfh0816Modé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 18.04.4 LTS
juillet 8, 2017 à 11:15 am #5688kholoParticipantsalut,
bon j’y aurait mis le temps…#!/bin/bash # ---------------------------------------------- NOM_LOGICIEL="${0##*/}" FONCTION="mise en script de cette page :
[Tuto] Créer des gifs animés de qualité à partir d’une vidéo
# ---------------------------------------------- le script créera un fichier de configuration pour les variables puis chargera une fenêtre de choix à partir d'une liste zenity # ---------------------------------------------- " DEPENDANCES_TODO=" DEPENDANCES : bash touch zenity tee ffmpeg # ---------------------------------------------- TODO : " VERSION="0.010" # NOTES DE VERSIONS # ---------------------------------------------- # kholo - cyril ury 07/2017 # # ---------------------------------------------- # ********************************************************************************* function _journal () { FICHIER_LOG="$NOM_LOGICIEL.log" if [ -f "$FICHIER_LOG" ]; then echo "" | tee "$FICHIER_LOG"; else touch "$FICHIER_LOG"; fi journal "ouverture - $(date)" journal "-------------------------------------------" } function journal () { echo -e "$@" | tee -a "$FICHIER_LOG" >/dev/null; } # echo "ouverture du journal" _journal # ********************************************************************************* # INITIALISATION DES VARIALES par des valeurs par défaut # Communs SOURCE="$HOME" DESTINATION="$HOME" # Mov2Mp4 # $SOURCE $VCODEC $DESTINATION # # Mp42Gifclassique # $SOURCE $RESOLUTION $DESTINATION # # Mp42Gif2classique # $DEBUT $DUREE $SOURCE $RESOLUTION $DESTINATION DEBUT="10" DUREE="5" # # Mp42Gifplus # $SOURCE $FPS $SCALE $FLAGS $PALETTE # $SOURCE $PALETTE $FILER_COMPLEX $DESTINATION # VCODEC="libx264" RESOLUTION="320x180" # VARIABLES # pour la partie 1 PALETTE="/tmp/palette.png" FPS=10 SCALE=320 FLAGS='lanczos' # pour la partie 2 FILER_COMPLEX="fps=$FPS,scale=$SCALE:-1:flags=$FLAGS[x];[x][1:v]paletteuse" # ********************************************************************************* # Fonctions générales Alias function msgbox () { zenity --info --text="$@" } # ********************************************************************************* # Etage pour le fichier Ini (conf) function parserLigneIni () { local ligne=$@ ; case $ligne in # xxxxx=*) xxxxxx="${ligne#*=}" ;; # =*) ="${ligne#*=}" ;; \#*) ;; NOM_LOGICIEL=*) NOM_LOGICIEL="${ligne#*=}" ;; VERSION=*) VERSION="${ligne#*=}" ;; SOURCE=*) SOURCE="${ligne#*=}" ;; DESTINATION=*) DESTINATION="${ligne#*=}" ;; RESOLUTION=*) RESOLUTION="${ligne#*=}" ;; DEBUT=*) DEBUT="${ligne#*=}" ;; DUREE=*) DUREE="${ligne#*=}" ;; VCODEC=*) VCODEC="${ligne#*=}" ;; PALETTE=*) PALETTE="${ligne#*=}" ;; FPS=*) FPS="${ligne#*=}" ;; SCALE=*) SCALE="${ligne#*=}" ;; FLAGS=*) FLAGS="${ligne#*=}" ;; FILER_COMPLEX=*) FILER_COMPLEX="${ligne#*=}" ;; " ") ;; *) journal "valeur ini inconnue ; \n$ligne" ;; esac } function chargerIni () { # [ -f "$FICHIER_INI" ] || \# while read ligne ; do # [ ! "${#ligne}" -eq 0 ] && [ ! "${ligne}" == " " ] && parserLigneIni "$ligne" ; parserLigneIni "$ligne" ; done < "$FICHIER_INI" ; } function sauverIni () { journal "function sauverIni" ; echo "# création automatique $0 # $(date) # vid2gif version $VERSION SOURCE=$SOURCE DESTINATION=$DESTINATION RESOLUTION=$RESOLUTION DEBUT=$DEBUT DUREE=$DUREE VCODEC=$VCODEC PALETTE=$PALETTE FPS=$FPS SCALE=$SCALE FLAGS=$FLAGS FILER_COMPLEX=$FILER_COMPLEX " | tee "$NOM_LOGICIEL.ini" >/dev/null ; [ $? -eq 0 ] && journal "sauvegarde effectuée" } # ********************************************************************************* function _initialisation () { journal "*******************initialisation*******************" ; journal "FICHIER_INI" ; FICHIER_INI="$NOM_LOGICIEL.ini" journal "le nom du fichier ini est : $FICHIER_INI" if [ -f $FICHIER_INI ] ; then journal "chargement du fichier ini" chargerIni ; else touch "$FICHIER_INI" fi } function _quitter () { journal "_quitter" # mettre ici tout ce qui sera nescessaire à la bonne fermeture # echo "$(sauverIni)" > "$NOM_LOGICIEL.ini" ; sauverIni ; exit 0 } # ********************************************************************************* # Fonctions pour définir les valeurs avec et pour Zenity function setRESOLUTION () { journal "set RESOLUTION" RESOLUTION_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="RESOLUTION :" \ --entry-text "$RESOLUTION")" ; case $? in 0) RESOLUTION="$RESOLUTION_new" ; echo "RESOLUTION=$RESOLUTION" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setDEBUT () { journal "set DEBUT" DEBUT_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="DEBUT :" \ --entry-text "$DEBUT")" ; case $? in 0) DEBUT="$DEBUT_new" ; echo "DEBUT=$DEBUT" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setDUREE () { journal "set DUREE" DUREE_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="DUREE :" \ --entry-text "$DUREE")" ; case $? in 0) DUREE="$DUREE_new" ; echo "DUREE=$DUREE" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setVCODEC () { journal "set VCODEC" VCODEC_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="VCODEC :" \ --entry-text "$VCODEC")" ; case $? in 0) VCODEC="$VCODEC_new" ; echo "VCODEC=$VCODEC" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setPALETTE () { journal "set PALETTE" PALETTE_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="PALETTE :" \ --entry-text "$PALETTE")" ; case $? in 0) PALETTE="$PALETTE_new" ; echo "PALETTE=$PALETTE" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setFPS () { journal "set FPS" FPS_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="FPS :" \ --entry-text "$FPS")" ; case $? in 0) FPS="$FPS_new" ; echo "FPS=$FPS" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setSCALE () { journal "set SCALE" SCALE_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="SCALE :" \ --entry-text "$SCALE")" ; case $? in 0) SCALE="$SCALE_new" ; echo "SCALE=$SCALE" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setFLAGS () { journal "set FLAGS" FLAGS_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="FLAGS :" \ --entry-text "$FLAGS")" ; case $? in 0) FLAGS="$FLAGS_new" ; echo "FLAGS=$FLAGS" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setFILER_COMPLEX () { journal "set FILER_COMPLEX" FILER_COMPLEX_new="$(zenity --entry \ --title="modifier la valeur de ..." \ --text="FILER_COMPLEX :" \ --entry-text "$FILER_COMPLEX")" ; case $? in 0) FILER_COMPLEX="$FILER_COMPLEX_new" ; echo "FILER_COMPLEX=$FILER_COMPLEX" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } # ********************************************************************************* function frm_principale () { journal "*******************frm_principale*******************" KA="SOURCE" KB="DESTINATION" KC="RESOLUTION" KD="DEBUT" KE="DUREE" KF="VCODEC" KG="PALETTE" KH="FPS" KI="SCALE" KJ="FLAGS" KK="FILER_COMPLEX" VA="$SOURCE" VB="$DESTINATION" VC="$RESOLUTION" VD="$DEBUT" VE="$DUREE" VF="$VCODEC" VG="$PALETTE" VH="$FPS" VI="$SCALE" VJ="$FLAGS" VK="$FILER_COMPLEX" LAQUESTION=" --------------------------------------------------------------------- Ce module crée une liste de choix Tout à faire - <b>pas encore codé</b>" tropLONG="ffmpeg -y -i SOURCE -vf fps=FPS,scale=SCALE:-1:flags=FLAGS,palettegen PALETTE ffmpeg -i SOURCE -i PALETTE -filter_complex FILER_COMPLEX DESTINATION" zenity --list --width=800 --height=600 --text="$LAQUESTION" \ --ok-label="Sélectionner" \ --cancel-label="quitter" \ --hide-column 1 --column "" --column "choix" --column "Valeur" \ 1 "$KA" "$VA" \ 2 "$KB" "$VB" \ 0 " -----------------" " ----------------------------------------" \ 3 "$KC" "$VC" \ 4 "$KD" "$VD" \ 5 "$KE" "$VE" \ 6 "$KF" "$VF" \ 7 "$KG" "$VG" \ 8 "$KH" "$VH" \ 9 "$KI" "$VI" \ 10 "$KJ" "$VJ" \ 11 "$KK" "$VK" \ 0 " -----------------" " ----------------------------------------" \ 100 "Mov2Mp4" "ffmpeg -i SOURCE -vcodec VCODEC DESTINATION" \ 101 "Mp42Gifclassique" "ffmpeg -i SOURCE -s RESOLUTION DESTINATION" \ 102 "Mp42Gif2classique" "ffmpeg -y -ss DEBUT -t DUREE -i SOURCE -s RESOLUTION DESTINATION" \ 103 "Mp42Gifplus" "$tropLONG" \ ; } function frm_principale_parser () { journal "*******************frm_principale_parser*******************" journal "frm_principale_parser : $1" case $1 in 1) setSource ;; 2) setDestination ;; 3) setRESOLUTION ;; 4) setDEBUT ;; 5) setDUREE ;; 6) setVCODEC ;; 7) setPALETTE ;; 8) setFPS ;; 9) setSCALE ;; 10) setFLAGS ;; 11) setFILER_COMPLEX ;; 100) Mov2Mp4 ;; 101) Mp42Gifclassique ;; 102) Mp42Gif2classique ;; 103) Mp42Gifplus ;; 0) ;; *) # POUR QUITTER PROPREMENT (sauver le ini !) QUITTER="1" _quitter ;; esac } # ********************************************************************************* # Choix et traitement des Sources et Destinations function setSource () { # on peut transformer cette partie pour des traitements par lots setFichiersSelectionnes } function setFichiersSelectionnes () { #sélectionner les images local SOURCE_new="$(zenity --file-selection \ --title="Séléctionnez des fichiers" \ --filename="$dossierImages/" \ --file-filter='Images (mp4, mov) | *.mp4 *.MP4 *.mov *.MOV' \ --file-filter='All files | *' \ )" ; # msgbox "$SOURCE_new" case $? in 0) SOURCE="$SOURCE_new" ; dossierImages="$(dirname "${SOURCE}")/" ; echo "SOURCE=$SOURCE" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } function setDestination () { # on peut transformer cette partie pour des traitements par lots setDESTINATION } function setDESTINATION () { # choisir un fichier de destination local DESTINATION_new="$(zenity --file-selection \ --title="Séléctionnez un fichier" \ --save --confirm-overwrite \ --filename="$DESTINATION" \ --file-filter='gif files (gif) | *.gif')" ; case $? in 0) DESTINATION="$DESTINATION_new" ; echo "DESTINATION=$DESTINATION" ;; 1) echo "annulé" ;; -1) echo "An unexpected error has occurred." ;; esac } # ********************************************************************************* # FONCTIONS SPECIFIQUES function Mov2Mp4 () { # Transformation d'un mov en mp4 unTEST="${SOURCE##*/}" # récupération du nom de fichier unTEST="${unTEST##*.}" # récupération de l'extension du fichier # unTEST="${unTEST,,}" # passage en minuscule pur bash if [ ! ${unTEST,,} == mov ] then msgbox "fonction Transformation d'un mov en mp4 \nle fichier : \n$SOURCE \nATTENTION LE FICHIER SOURCE DOIT ÊTRE un MOV !" else # ffmpeg -i /point/de/montage/source.MOV -vcodec libx264 /point/de/montage/source.mp4 ffmpeg -i "$SOURCE" -vcodec "$VCODEC" "$DESTINATION" fi } function Mp42Gifclassique () { # Création d’un GIF animé, méthode «classique» # A) gif contenant toute la vidéo # ffmpeg -i /point/de/montage/source.mp4 -s 320x180 /point/de/montage/final.gif ffmpeg -y -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" } function Mp42Gifplus () { journal "Mp42Gifplus" journal "# étape 1 : génération d’une palette de couleurs" # exemple : ffmpeg -y -i /point/de/montage/source.mp4 -vf fps=10,scale=320:-1:flags=lanczos,palettegen /point/de/montage/palette.png ffmpeg -y -i "$SOURCE" -vf fps="$FPS",scale="$SCALE":-1:flags="$FLAGS",palettegen "$PALETTE" && { journal "# étape 1 : ok" journal "# étape 2 : génération du GIF animé «amélioré»" # ffmpeg -i /point/de/montage/source.mp4 -i /point/de/montage/palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" /point/de/montage/final.gif ffmpeg -y -i "$SOURCE" -i "$PALETTE" -filter_complex "$FILER_COMPLEX" "$DESTINATION" } && { journal "# étape 2 : ok" journal "# étape 3 : supprimer la palette" rm -f $PALETTE } && { journal "# étape 3 : ok" } } # ********************************************************************************* function _main () { journal "_main" menuchoice=$(frm_principale); frm_principale_parser ${menuchoice%|*} # pour corriger le 1|1 if [ $QUITTER!="1" ] ; then # on boucle _main tant que quitter est différent de 1 _main fi } #-initialisation _initialisation ; # Programme principale _main exit 0juillet 8, 2017 à 12:29 pm #5689kholoParticipantje maintiendrai la page dans le forum d’ubuntu :
https://forum.ubuntu-fr.org/viewtopic.php?pid=21758940#p21758940juillet 9, 2017 à 9:00 pm #5692nam1962Maître des clésExtra le script.
Je pense en faire un topic séparé avec une intro de jlfh0816 (et une lien de ce topic vers le script, qu’en pensez vous ?Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc
juillet 10, 2017 à 10:06 pm #5696jlfh0816Modérateur@kholo
Alors là, chapeau bas !
Bravo à toi pour ton travail, je suis épaté.
Là, je suis au travail et je n’ai pas de PC sous Linux pour tester mais je serai de repos mercredi et je testerai tranquillement chez moi ton script. Je sens qu’il va me plaire… encore merci !
Je te tiens au courant de mes essais dès que faits.@nam
pas de problème mais il faut absolument mettre le travail de kholo en exergue car il apporte vraiment de la valeur à ce sujet.Xubuntu-Voyager 18.04.4 LTS
septembre 8, 2018 à 12:37 pm #9262jibelModérateurSalut les gars,
J’ai perso un gros ennui de ne savoir comment modifier une vidéo sur sa durée ou sa qualité de son, j’ai handbrake dans mon OS mais j’ai un souci avec l’anglais pour connaître et suivre ce qui doit être fait pour modifier cette vidéo ? Qui peut me dire comment utiliser ce logiciel, ou un autre logiciel de convertir une vidéo, d’une manière très intéressante ? Mes vidéos qui étaient ici , je n’ai pas eu de PB pour qu’elles soient publiées mais sans y ajouter ou enlever QQchose en trop? merci et @ + cordialement Jibel 😉 😎mai 3, 2020 à 12:08 pm #11726RiQParticipantIl y a aussi gifski voir: https://gif.ski/
-
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.