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

Je convertisse le fichier .flv au 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 très faible qualité.

Quelques idées comment puis-je améliorer la qualité des GIF converties?

Sortie de commande:

 ffmpeg -i input.flv -ss 00:00:00.000 -pix_fmt rgb24 -r 10 -s 320x240 -t 00:00:10.000 output.gif 
 ffmpeg version 0.8.5-6:0.8.5-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers built on Jan 24 2013 14:52:53 with gcc 4.7.2 *** THIS PROGRAM IS DEPRECATED *** This program is only provided for compatibility and will be removed in a future release. Please use avconv instead. Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'input.flv': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2013-02-14 04:00:07 Duration: 00:00:18.85, start: 0.000000, bitrate: 3098 kb/s Stream #0.0(und): Video: h264 (High), yuv420p, 1280x720, 2905 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc Metadata: creation_time : 1970-01-01 00:00:00 Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 192 kb/s Metadata: creation_time : 2013-02-14 04:00:07 [buffer @ 0x92a8ea0] w:1280 h:720 pixfmt:yuv420p [scale @ 0x9215100] w:1280 h:720 fmt:yuv420p -> w:320 h:240 fmt:rgb24 flags:0x4 Output #0, gif, to 'output.gif': Metadata: major_brand : mp42 minor_version : 0 compatible_brands: isommp42 creation_time : 2013-02-14 04:00:07 encoder : Lavf53.21.1 Stream #0.0(und): Video: rawvideo, rgb24, 320x240, q=2-31, 200 kb/s, 90k tbn, 10 tbc Metadata: creation_time : 1970-01-01 00:00:00 Stream mapping: Stream #0.0 -> #0.0 Press ctrl-c to stop encoding frame= 101 fps= 32 q=0.0 Lsize= 8686kB time=10.10 bitrate=7045.0kbits/s dup=0 drop=149 video:22725kB audio:0kB global headers:0kB muxing overhead -61.778676% 

Merci.

    ffmpeg peut maintenant générer un GIF de qualité supérieure. Si vous utilisez une version antérieure, envisagez de télécharger une construction statique récente ou une compilation de ffmpeg .

    Exemple ffmpeg

    Gif avec ffmpeg
    203k

    Cet exemple saute les 30 premières secondes de l'entrée et crée une sortie de 3 secondes. Il augmentera la puissance de 320 pixels de largeur et déterminera automatiquement la hauteur tout en préservant le rapport d'aspect. Les filtres palettegen et paletteuse généreront et utiliseront une palette personnalisée générée à partir de votre source.

    1. Générer une palette:

       ffmpeg -y -ss 30 -t 3 -i input.flv \ -vf fps=10,scale=320:-1:flags=lanczos,palettegen palette.png 
    2. Sortez le GIF à l'aide de la palette:

       ffmpeg -ss 30 -t 3 -i input.flv -i palette.png -filter_complex \ "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif 

    Voir GIF de haute qualité avec FFmpeg pour beaucoup d'autres exemples et options.


    Exemple de convert

    Une autre méthode de ligne de commande serait d'exporter le film vers des images à l'aide de ffmpeg puis de transformer le GIF en ImageMagick (ou GraphicsMagick).

    Ffmpeg et convertir
    246k

    1. Exporter les cadres:

        mkdir frames ffmpeg -i input -vf scale=320:-1:flags=lanczos,fps=10 frames/ffout%03d.png 
    2. Puis utilisez convert (ou gm convert si vous préférez GraphicsMagick) pour créer votre GIF animé:

        convert -loop 0 frames/ffout*.png output.gif 

    Avec convert vous pouvez contrôler le délai entre les images avec -delay si désiré.

    Si vous préférez éviter les fichiers d'images intermédiaires, les commandes fournies par LordNeckBeard peuvent être diffusées entre ffmpeg et la convert d'ImageMagick afin qu'aucun fichier intermédiaire ne soit requis:

     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 appropriée pour être -vcodec ppm , et -vcodec ppm spécifie que le format de sortie soit en ppm (pour une raison quelconque si le format est png, convert ne lit pas toutes les images De la pipe, ou ffmpeg ne les affiche pas tous). Le - pour les deux commandes spécifie qu'un tuyau sera utilisé pour la sortie et l'entrée respectivement.

    Pour optimiser le résultat sans enregistrer un fichier, vous pouvez faire passer la sortie de la convert à une deuxième commande de 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:- raconte à convert en pipeline sa sortie en tant que données formatées gif et les -layers Optimize indique la deuxième convert pour effectuer optimize-transparancy méthodes d' optimize-transparancy et d' optimize-transparancy (voir ImageMagick Introduction to Animation Optimization ). Notez que la sortie des -layers Optimize peut ne pas toujours fournir une taille de fichier plus petite, donc vous pouvez essayer de convertir un gif sans optimisation d'abord pour être sûr.

    Rappelez-vous que pendant tout ce processus, tout est en mémoire afin que vous ayez besoin d'une mémoire suffisante si les images sont assez grandes.

    À 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

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

    En ./gifenc input.mov output.gif 720 10 exécution ./gifenc input.mov output.gif 720 10 gif à partir du film que vous lui avez donné. Vous pourriez avoir besoin de 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

    Suppléments: ffmpeg est installé, le script se trouve dans le même dossier que les autres fichiers.

    A fait un script, a testé et fonctionne.

    usage:

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

    AVEZ PHON 🙂

    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 ScreenCapturing pour Linux 🙂

    MERCI BEAUCOUP Michael Kohaupt 🙂 Rock stable.

    Certaines statistiques de taille de fichier:

    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.

    Linux / Unix / macOS

    En suivant l'approche @LordNeckbeard avec la commande ffmpeg , recherchez 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 le fichier chargé ( . ~/.bash_profile ), vous devriez avoir une nouvelle commande video2gif .

    Exemple d'utilisation:

     video2gif input.flv 

    ou:

     video2gif input.flv 320 10 

    Échelle à 320 largeur avec 10 images par seconde.

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


    Macos

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


    Alternativement, il existe plusieurs sites qui effectuent la conversion en ligne gratuitement.

    Ci-dessous le fichier de commandes 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: extraire juste un échantillon

    Si vous souhaitez simplement utiliser une variable d'entrée et que le nom de sortie possède juste l'extension GIF (prononcé JIF), utilisez-le à la place:

     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 

    Pour les utilisateurs de Windows:
    video2gif.bat fichier 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 alors, n'importe où vous pouvez l'utiliser, c'est comme cet exemple:

     video2gif myvideo.mp4 

    Ensuite, vous avez myvideo.gif dans le répertoire actuel.
    Si myvideo.gif existe, demandez-vous de l'écraser.

    MODIFIER:

    Dd1515151515151515151515151515 'TrauseAAAuderiaAtapeviasficidence de l'établissements AHMMMMMM HébergementAuderHeldMachésTachachistánTelMachésédachachistánAustréMádMachéstaMachachésTachachistánAppemlemméesAachachetteTachachistánTelMachésédachachéachachistánAtaustrésíedoAta