2013-02-22 20:06:30 +0000 2013-02-22 20:06:30 +0000
335
335

Comment puis-je convertir une vidéo en GIF en utilisant ffmpeg, avec une qualité raisonnable ?

Je convertis une vidéo en fichier GIF avec ffmpeg :

ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif

Cela fonctionne très bien, mais le fichier gif de sortie a une qualité très faible.

Des idées pour améliorer la qualité du gif converti ?

Réponses (12)

505
505
505
2013-02-22 21:31:46 +0000

ffmpeg exemple

183k

ffmpeg peuvent produire des GIF de haute qualité. Avant de commencer, il est toujours recommandé d'utiliser une version récente : Télécharger ](https://ffmpeg.org/download.html) ou compiler ](https://trac.ffmpeg.org/wiki/CompilationGuide).

ffmpeg -ss 30 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
  • Cet exemple sautera les 30 premières secondes (-ss 30) de l'entrée et créera une sortie de 3 secondes (-t 3).
  • Le filtre fps définit la fréquence d'images. Un taux de 10 images par seconde est utilisé dans l'exemple.
  • scale filter redimensionnera la sortie à 320 pixels de large et déterminera automatiquement la hauteur tout en préservant le rapport d'aspect. Le lanczos algorithme de mise à l'échelle est utilisé dans cet exemple.
  • palettegen et paletteuse généreront et utiliseront une palette personnalisée générée à partir de vos entrées. Ces filtres ont de nombreuses options, veuillez donc vous référer aux liens pour obtenir une liste de toutes les options et valeurs disponibles. Voir également la section Options avancées ci-dessous.
  • split filter permettra de tout faire en une seule commande et évitera d'avoir à créer un fichier PNG temporaire de la palette.
  • Control looping avec l'option de sortie -loop mais les valeurs sont confuses. Une valeur de 0 est un bouclage infini, -1 n'est pas un bouclage, et 1 bouclera une fois, ce qui signifie qu'il sera joué deux fois. Ainsi, une valeur de 10 fera jouer le GIF 11 fois.

Options avancées

Les filtres palettegen et paletteuse ont de nombreuses options supplémentaires. Les plus importantes sont :

  • stats_mode (palettegen). Vous pouvez forcer les filtres à concentrer la palette sur l'image générale (full qui est la valeur par défaut), uniquement sur les parties mobiles (diff), ou sur chaque image individuelle (single). Par exemple, pour générer une palette pour chaque image individuelle, utilisez palettegen=stats_mode=single & paletteuse=new=1.

  • dither (paletteuse). Choisissez l'algorithme de dithering. Il en existe trois principaux types : déterministe (bayer), diffusion d'erreur (tous les autres y compris le sierra2_4a par défaut), et aucun. Votre GIF peut avoir meilleure apparence en utilisant un algorithme de dithering particulier, ou pas de dithering du tout. Si vous voulez essayer bayer, assurez-vous de tester également l'option bayer_scale.

Voir GIF haute qualité avec FFmpeg pour des explications, des images d'exemple et des informations plus détaillées pour une utilisation avancée.

Voir également la documentation palettegen et paletteuse pour toutes les options et valeurs disponibles.


ImageMagick convert exemple

227k

Une autre méthode en ligne de commande consiste à passer de ffmpeg à convert (ou magick) depuis ImageMagick. Options de

ffmpeg -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v pam -f image2pipe - | convert -delay 10 - -loop 0 -layers optimize output.gif

ffmpeg :

  • -vf "fps=10,scale=320:-1:flags=lanczos" a filtergraph en utilisant les filtres fps et scale . fps fixe la fréquence d'image à 10, et scale fixe la taille à 320 pixels de large et la hauteur est automatiquement déterminée et utilise une valeur qui préserve le rapport d'aspect. Le lanczos algorithme de mise à l'échelle est utilisé dans cet exemple.

  • -c:v pam Choisit l'encodeur d'image pam. L'exemple produit le format d'image PAM (Portable AnyMap) qui est un format RVB simple et sans perte qui prend en charge la transparence (alpha) et qui est pris en charge par convert. Il est plus rapide à encoder que le PNG.

  • -f image2pipe choisit le muxer image2pipe car lors de la sortie vers un pipe, ffmpeg doit être informé du muxer à utiliser. Options de

  • convert :

  • -delay Voir la section Réglage de la fréquence d'images ci-dessous.

  • -loop 0 fait une boucle infinie.

  • -layers optimize activera l'optimiseur GIF d'usage général. Voir ImageMagick Animation Optimization pour plus de détails. Il n'est pas garanti qu'il produira un résultat plus petit, il vaut donc la peine d'essayer sans -layers optimize et de comparer les résultats.

Réglage de la fréquence d'images

Régler la fréquence d'images avec une combinaison du filtre fps dans ffmpeg et -delay dans convert. Cela peut être compliqué car convert obtient juste un flux d'images brut, donc aucune image par seconde n'est préservée. Deuxièmement, la valeur de -delay dans convert est en ticks (il y a 100 ticks par seconde), et non en images par seconde. Par exemple, avec fps=12.5 = 100/12,5 = 8 = -delay 8.

convert arrondit la valeur de -delay à un nombre entier, donc 8,4 donne 8 et 8,5 donne 9. Cela signifie en fait que seulement certaines fréquences d'images sont supportées lors de la définition d'un délai uniforme sur toutes les images (un délai spécifique peut être défini par image mais cela dépasse cette réponse).

-delay semble être ignoré s'il est utilisé comme option de sortie, il doit donc être utilisé avant - comme le montre l'exemple.

Enfin, les navigateurs et les visionneuses d'images peuvent mettre en place un délai minimum, de sorte que votre -delay peut être ignoré de toute façon.

Vidéo avec l'aimable autorisation du centre national de formation à la conservation du U.S. Fish & Wildlife Service.

88
88
88
2014-03-18 09:47:53 +0000

Si vous préférez éviter les fichiers d'images intermédiaires, les commandes fournies par LordNeckBeard peuvent être acheminées entre ffmpeg et convert d'ImageMagick, de sorte qu'aucun fichier intermédiaire n'est nécessaire :

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - output.gif

Le -f image2pipe indique à ffmpeg de diviser la vidéo en images et de la rendre apte à être transmise, et le -vcodec ppm spécifie le format de sortie en ppm (pour une raison quelconque, si le format est png, soit le convert ne lit pas toutes les images de la transmission, soit le ffmpeg ne les transmet pas toutes). Le - pour les deux commandes spécifie qu'un tube sera utilisé pour la sortie et l'entrée respectivement.

Pour optimiser le résultat sans enregistrer un fichier, vous pouvez transférer la sortie de convert vers une seconde commande convert :

ffmpeg -i input.flv -vf scale=320:-1 -r 10 -f image2pipe -vcodec ppm - | convert -delay 5 -loop 0 - gif:- | convert -layers Optimize - output.gif

Le gif:- indique à convert de transférer sa sortie sous forme de données au format gif et à la seconde -layers Optimize d'exécuter les méthodes convert et optimize-frame (voir ImageMagick Introduction to Animation Optimization ). Notez que la sortie de optimize-transparancy peut ne pas toujours fournir une taille de fichier plus petite, donc vous pouvez essayer de convertir en gif sans optimisation d'abord pour être sûr.

Rappelez-vous que pendant tout ce processus, tout est en mémoire, donc vous pouvez avoir besoin de suffisamment de mémoire si les images sont assez grandes.

38
38
38
2015-03-23 18:39:20 +0000

À partir de ffmpeg 2.6, nous pouvons faire encore mieux :

palette="/tmp/palette.png"
filters="fps=15,scale=320:-1:flags=lanczos"

ffmpeg -i input.flv -vf "$filters,palettegen" -y $palette
ffmpeg -i input.flv -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y output.gif

HT

20
20
20
2017-10-05 12:04:32 +0000

La réponse de @Stephane est très bonne. Mais il recevra un avertissement du type Buffer queue overflow, dropping. pour certaines vidéos, et le gif généré a quelques images perdues.

Voici une meilleure version avec le filtre fifo pour éviter le Buffer queue overflow lors de l'utilisation du filtre paletteuse. En utilisant le filtre split pour éviter la création de fichier PNG de palette intermédiaire.

ffmpeg -i input.mp4 -filter_complex 'fps=10,scale=320:-1:flags=lanczos,split [o1] [o2];[o1] palettegen [p]; [o2] fifo [o3];[o3] [p] paletteuse' out.gif
18
18
18
2015-07-12 09:35:07 +0000

J'ai fait ma propre version du script, qui paramètre également la résolution de sortie et la fréquence d'images.

Running ./gifenc.sh input.mov output.gif 720 10 produira un GIF 720p large 10fps à partir du film que vous lui avez donné. Vous devrez peut-être faire chmod +x gifenc.sh pour le fichier.

#!/bin/sh

palette="/tmp/palette.png"

filters="fps=$4,scale=$3:-1:flags=lanczos"

ffmpeg -v warning -i "$1" -vf "$filters,palettegen" -y "$palette"
ffmpeg -v warning -i "$1" -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y "$2"

Vous pouvez lire les détails sur mon Github

Hypothèses : ffmpeg est installé, et le script se trouve dans le même dossier que les autres fichiers.

12
12
12
2017-09-30 15:23:29 +0000

Le ffmpeg avec palette méthode peut être exécuté en une seule commande, sans fichier intermédiaire .png.

ffmpeg -y -ss 30 -t 3 -i input.flv -filter_complex \
"fps=10,scale=320:-1:flags=lanczos[x];[x]split[x1][x2]; \
[x1]palettegen[p];[x2][p]paletteuse" output.gif

Ceci peut être fait grâce au filtre split .

11
11
11
2015-05-28 10:55:51 +0000

fait un script, testé et fonctionne.

usage :

./avi2gif.sh ./vokoscreen-2015-05-28_12-41-56.avi

HAVE PHUN :)

vim avi2gif.sh

#!/bin/sh

INPUT=$1

# default settings, modify if you want.

START_AT_SECOND=0; # in seconds, if you want to skip the first 30 seconds put 30 here

LENGTH_OF_GIF_VIDEO=9999999; # in seconds, how long the gif animation should be

echo "Generate a palette:"
ffmpeg -y -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png

echo "Output the GIF using the palette:"
ffmpeg -ss $START_AT_SECOND -t $LENGTH_OF_GIF_VIDEO -i $INPUT -i palette.png -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT.gif

btw : vokoscreen est un EXCELLENT outil de capture d'écran pour Linux :)

REMERCIE BEAUCOUP Michael Kohaupt :) Très stable.

quelques statistiques sur la taille des fichiers :

5.3M = vokoscreen-2015-04-28_15-43-17.avi -> vokoscreen-2015-05-28_12-41-56.avi.gif = 1013K

voir les résultats ici.

10
10
10
2016-12-09 17:34:16 +0000

Linux/Unix/macOS

En suivant @LordNeckbeard approach avec la commande ffmpeg, veuillez trouver la fonction Bash utile suivante qui peut être ajoutée dans votre fichier ~/.bash_profile :

# Convert video to gif file.
# Usage: video2gif video_file (scale) (fps)
video2gif() {
  ffmpeg -y -i "${1}" -vf fps=${3:-10},scale=${2:-320}:-1:flags=lanczos,palettegen "${1}.png"
  ffmpeg -i "${1}" -i "${1}.png" -filter_complex "fps=${3:-10},scale=${2:-320}:-1:flags=lanczos[x];[x][1:v]paletteuse" "${1}".gif
  rm "${1}.png"
}

Une fois la fonction chargée (manuellement ou à partir de . ~/.bash_profile), vous devriez avoir la nouvelle commande video2gif.

Exemple d'utilisation :

video2gif input.flv

ou :

video2gif input.flv 320 10

Mise à l'échelle à 320 de largeur avec 10 images par seconde. Vous pouvez également spécifier un format vidéo différent (tel que mp4). 002


macOS

Vous pouvez essayer l'application GIF Brewery qui peut créer des GIF à partir de fichiers vidéo. 002


Il existe également plusieurs sites web qui effectuent gratuitement des conversions en ligne.

9
9
9
2017-11-14 23:01:37 +0000

La réponse choisie suppose que vous souhaitez mettre à l'échelle la vidéo source et changer ses fps dans le gif produit. Si vous n'avez pas besoin de faire cela, les travaux suivants :

src="input.flv"
dest="output.gif"
palette="/tmp/palette.png"

ffmpeg -i $src -vf palettegen -y $palette
ffmpeg -i $src -i $palette -lavfi paletteuse -y $dest

Cela s'est avéré utile lorsque j'ai voulu un gif qui recréait fidèlement la vidéo source que j'utilisais.

6
6
6
2017-04-21 15:36:34 +0000

Pour les utilisateurs de Windows : créer un fichier video2gif.bat dans le répertoire Windows avec le contenu suivant :

@echo off
set arg1=%1
set arg2=%arg1:~0,-4%
ffmpeg -y -i %arg1% -vf fps=10,scale=-1:-1:flags=lanczos,palettegen %TEMP%\palette.png
ffmpeg -i %arg1% -i %TEMP%\palette.png -filter_complex "fps=10,scale=-1:-1:flags=lanczos[x];[x][1:v]paletteuse" %arg2%.gif
del /f %TEMP%\palette.png

Et ensuite, partout où vous pouvez l'utiliser, comme dans cet exemple :

video2gif myvideo.mp4

Vous avez alors myvideo.gif dans le répertoire courant. Si myvideo.gif existe, demandez-lui de l'écraser.

EDIT:

Je vous suggère d'utiliser ce script par lots https://github.com/NabiKAZ/video2gif

4
4
4
2016-06-23 22:31:26 +0000

Voici le fichier batch pour les utilisateurs de Windows :

gifenc.bat:

set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %2

Source : GIF de haute qualité avec FFmpeg : Extraction d'un échantillon seulement

Si vous souhaitez utiliser une seule variable d'entrée et que le nom de sortie ne porte que l'extension GIF (prononcée JIF), utilisez plutôt ceci :

set start_time=0
set duration=60
set palette="c:\temp\palette.png"
set filters="fps=15,scale=-1:-1:flags=lanczos"
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -vf "%filters%,palettegen" -y %palette%
set var1=%1
set var2=%var1:~0,-4%
ffmpeg -v warning -ss %start_time% -t %duration% -i %1 -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y %var2%.gif
3
3
3
2018-04-15 23:48:54 +0000

Comment ajouter une entrée de menu contextuel “clic droit” de Windows 7/10 pour convertir votre fichier vidéo en gif

Certaines des autres réponses mentionnent le script video2gif , que j'ai utilisé. Mais vous pouvez utiliser n'importe quel script.

Pour créer l'option du menu contextuel, vous devez modifier votre registre. Ouvrez une invite de commande powerhell, en exécutant w/ admin privs. Exécutez les commandes suivantes :

$key = "Registry::HKEY_CLASSES_ROOT# Comment ajouter une entrée de menu contextuel "clic droit" de Windows 7/10 pour convertir votre fichier vidéo en gif 

Certaines des autres réponses mentionnent le script [ video2gif ]&003, que j'ai utilisé. Mais vous pouvez utiliser n'importe quel script. 

Pour créer l'option du menu contextuel, vous devez modifier votre registre. Ouvrez une invite de commande powerhell, en exécutant w/ admin privs. Exécutez les commandes suivantes : 

*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force

Maintenant, lorsque vous cliquez avec le bouton droit de la souris sur un fichier, vous obtenez l'option “Run Video2Gif” !

Par ailleurs, j'ai installé ffmpeg sur `C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static# Comment ajouter une entrée de menu contextuel “clic droit” de Windows 7/10 pour convertir votre fichier vidéo en gif

Certaines des autres réponses mentionnent le script [ video2gif ]&003, que j'ai utilisé. Mais vous pouvez utiliser n'importe quel script.

Pour créer l'option du menu contextuel, vous devez modifier votre registre. Ouvrez une invite de commande powerhell, en exécutant w/ admin privs. Exécutez les commandes suivantes :

$key = "Registry::HKEY_CLASSES_ROOT# Comment ajouter une entrée de menu contextuel "clic droit" de Windows 7/10 pour convertir votre fichier vidéo en gif 

Certaines des autres réponses mentionnent le script [ video2gif ]&003, que j'ai utilisé. Mais vous pouvez utiliser n'importe quel script. 

Pour créer l'option du menu contextuel, vous devez modifier votre registre. Ouvrez une invite de commande powerhell, en exécutant w/ admin privs. Exécutez les commandes suivantes : 

*\shell\Run Video2Gif"
New-Item -Path $key"\Command" -Value "C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat `"%1`"" -Force

Maintenant, lorsque vous cliquez avec le bouton droit de la souris sur un fichier, vous obtenez l'option “Run Video2Gif” !

Par ailleurs, j'ai installé ffmpeg sur et j'ai mis le script video2gif.bat dans le répertoire bin juste à côté de ffmpeg.exe. J'ai également ajouté C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin à ma fenêtre PATH, mais je ne pense pas que vous en ayez besoin.

Si vous voulez avoir la possibilité de fournir des drapeaux / args supplémentaires en ligne de commande au script, alors créez un nouveau fichier nommé video2gif-prompt.bat, et demandez au registre de le référencer à la place de video2gif.bat :

@echo off
set /p inp=Enter extrta args, if desired:
C:\dev\ffmpeg\ffmpeg-3.4.2-win64-static\bin\video2gif.bat %* %inp%

Vous pouvez toujours appuyer sur entrée pour obtenir rapidement les valeurs par défaut.