673 votes

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

Je suis en train de convertir 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

Il fonctionne très bien, mais le fichier gif de sortie est de très mauvaise qualité.

Avez-vous une idée de la façon dont je peux améliorer la qualité du gif converti ?

5 votes

Excellent billet des ingénieurs de giphy engineering.giphy.com/how-to-make-gifs-with-ffmpeg

18voto

Jet Blue Points 247

La réponse sélectionnée suppose que vous souhaitez mettre à l'échelle la vidéo source et modifier ses images par seconde dans le gif produit. Si vous n'avez pas besoin de faire cela, la réponse suivante fonctionne :

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é pratique lorsque j'ai voulu un gif qui recréait fidèlement la vidéo source que j'utilisais.

16voto

jpoh Points 2610

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

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

Cela peut être fait grâce à la split filtre.

11voto

sdhengsoft Points 11

Fait un script, testé et fonctionne.

l'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 :)

MERCI BEAUCOUP Michael Kohaupt :) Rock steady.

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 le résultats ici.

9voto

Luke Sneeringer Points 4032

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

@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 puis partout où vous pouvez l'utiliser, comme dans cet exemple :

video2gif myvideo.mp4

Alors vous avez myvideo.gif dans le répertoire actuel.
Si myvideo.gif il existe, question de vous pour l'écraser.

EDIT :

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

2 votes

Je vois que vous avez fait deux choses ici : (1)écrire les commandes comme une commande Windows (.BAT) script, et (2)fournir une combinaison différente de filtres (aucune des autres réponses n'utilise beide fps=10 y scale=-1:-1 ). La réponse de Sun nous a déjà donné un fichier batch, et celui-là (comme le Shell Shell en La réponse de pje y la réponse de l'évangéliste ) a l'avantage d'assigner la liste des filtres à une variable ( 一旦 ), (Suite)

1 votes

(Suite) de sorte qu'il n'a pas besoin d'épeler la liste deux fois (comme le fait votre fichier batch). (Je présume que cela crée un risque que, si l'utilisateur édite le script pour modifier une des listes mais pas l'autre, l'incohérence causera un problème). Pouvez-vous au moins expliquer votre choix de filtres ( fps=10,scale=-1:-1 ) ? (Voir réponse de notedible pour un exemple d'explication des parties d'une commande).

1 votes

@Scott Vous avez dit juste, donc j'écris un nouveau script utile ici : github.com/NabiKAZ/video2gif

7voto

Aphex Points 161

Commandes ffmpeg :

  1. Exécutez cette commande pour que ffmpeg puisse trouver une bonne palette :

    ffmpeg -y -i foo.mp4 -vf fps=30,scale=320:-1:flags=lanczos,palettegen palette.png
  2. Exécutez cette commande pour convertir le fichier mp4 en gif :

    ffmpeg -y -i foo.mp4 -i palette.png -filter_complex "fps=30,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" foo.gif

Vous pourriez vouloir ajuster les fps et l'échelle. Plus petite pour l'un ou l'autre, la taille du fichier sera meilleure.

Création d'une fonction alias simple

Vous pouvez également créer une fonction alias comme ceci. Je l'ai ajoutée à mon .bashrc o .bash_profile :

function makegif {
  ffmpeg -y -i $1 -vf fps=30,scale=320:-1:flags=lanczos,palettegen palette.png
  ffmpeg -y -i $1 -i palette.png -filter_complex "fps=30,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" $1.gif
}

Et puis juste makegif foo

Note : Vous aurez besoin de ffmpeg bien sûr. Obtenez-le ici https://www.ffmpeg.org/download.html o brew install ffmpeg

0 votes

Merci pour la fonction alias. Elle est très pratique

0 votes

La partie de cette réponse concernant FFmpeg est presque identique à celle de la réponse concernant FFmpeg. La réponse de llogan sauf que celui-ci crée un fichier de palette intermédiaire et ne fournit aucune description ou lien de documentation. La partie alias de cette réponse (qui répond à une autre question, de toute façon) est identique à la réponse suivante La réponse de kenorb sauf que celui-ci n'a pas la citation du chemin et fps y scale paramètres. -1 pour ne rien ajouter de nouveau.

0 votes

Comment désactiver le frame dropping et l'image fantôme précédente ? mon filtre complexe est le suivant fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]paletteg‌​en[p];[s1][p]palette‌​use

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X