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

106voto

notedible Points 1089

Si vous préférez éviter les fichiers images intermédiaires, les commandes fournies par LordNeckBeard peuvent être passées entre ffmpeg et de ImageMagick convert 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 10 -loop 0 - output.gif

El -f image2pipe indique à ffmpeg de diviser la vidéo en images et de la rendre apte à être diffusée, et -vcodec ppm spécifie le format de sortie à utiliser pour les ppm (pour une raison quelconque, si le format est png, soit convert ne lit pas toutes les images du pipe, ou ffmpeg ne les sort pas toutes). Le site - 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 sauvegarder un fichier, vous pouvez faire passer la sortie de convert à un deuxième convert comando:

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

El gif:- dit à convert pour acheminer sa sortie sous forme de données au format gif et -layers Optimize indique au second convert d'effectuer optimize-frame y optimize-transparancy (voir les méthodes d'ImageMagick Introduction à l'optimisation de l'animation ). Notez que la sortie de la fonction -layers Optimize ne permet pas toujours d'obtenir une taille de fichier plus petite. Vous pouvez donc essayer de convertir en gif sans optimisation pour être sûr.

N'oubliez pas que, pendant tout ce processus, tout se passe en mémoire. Vous aurez donc besoin de suffisamment de mémoire si les images sont assez grandes.

1 votes

Cet ensemble de commandes fonctionne également avec avconv

0 votes

Vous devez fusionner les deux dernières commandes de conversion : convert -delay 5 -loop 0 -layers Optimize - output.gif

2 votes

Le gif semble fonctionner à deux fois la vitesse de la vidéo source ?

57voto

pje Points 571

À partir de ffmpeg 2.6, nous pouvons faire encore mieux. Basé sur GIF de haute qualité avec FFmpeg :

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

9 votes

Qu'est-ce que ça fait ?

35voto

alijandro Points 351

La réponse de @Stephane est très bonne. Mais elle donnera lieu à un avertissement du type Buffer queue overflow, dropping. pour une certaine vidéo, et les gif a perdu quelques cadres.

Voici une meilleure version avec fifo filtre à éviter Buffer queue overflow lors de l'utilisation de paletteuse filtre. En utilisant split pour éviter la création d'un 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

0 votes

Si je comprends bien, vous divisez l'entrée en o1 et o2, et vous copiez o2 vers o3. Alors pourquoi avez-vous besoin de o3 ? pourquoi ne pas utiliser directement o2 ?

1 votes

@Chloe Avez-vous vu le fifo fonctionnement du filtre entre o2 y o3 ? Pour éviter le Buffer queue overflow avertissement.

30voto

thevangelist Points 454

J'ai fait ma propre version de ce 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 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 est dans le même dossier que les autres fichiers.

3 votes

Merci beaucoup pour votre script. Je viens de le tester et il fonctionne très bien !

2 votes

Ce script est exactement ce que je voulais - un moyen super facile de convertir les captures d'écran d'OBS en gifs pour le signalement des bugs.

23voto

kenorb Points 22006

Linux/Unix/macOS

Suivant @LordNeckbeard approche con ffmpeg veuillez trouver la fonction Bash utile suivante qui peut être ajoutée à votre commande ~/.bash_profile fichier :

# 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 que la fonction est chargée (manuellement ou à partir de . ~/.bash_profile ), vous devriez avoir de nouvelles video2gif comando.

Exemple d'utilisation :

video2gif input.flv

ou :

video2gif input.flv 320 10

Passez à une largeur de 320 avec 10 images par seconde.

Vous pouvez également spécifier un format vidéo différent (tel que mp4).


macOS

Vous pouvez essayer Brasserie GIF Une application qui permet de créer des GIF à partir de fichiers vidéo.


Il existe également plusieurs sites web qui effectuent la conversion en ligne gratuitement.

0 votes

Votre script soulève une erreur pour moi à propos de l'absence de fichier png et je n'obtiens pas de sortie gif, mais le fichier d'entrée .mp4 reste inchangé.

1 votes

Merci. Parames de 1500 y 40 pour moi personnellement de générer des gifs de qualité parfaite.

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