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
.
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.
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
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.
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).
246k
Exporter les cadres:
mkdir frames ffmpeg -i input -vf scale=320:-1:flags=lanczos,fps=10 frames/ffout%03d.png
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.
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).
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