web-dev-qa-db-fra.com

FFMPEG: gif animé de haute qualité?

Je génère un gif animé à partir d'une vidéo sur mon serveur.

Le gif animé généré n’est pas vraiment de grande qualité et on dirait que les pixels sont énormes.

Exemple:

 enter image description here

Voici comment je génère le gif:

Shell_exec("/usr/bin/ffmpeg -i video.mkv -vf scale=500:-1 -t 10 -r 10 image.gif");

J'ai fait une recherche sur google et suis tombé sur ce code:

Shell_exec("/usr/bin/ffmpeg -i video.mkv -r 20 -f image2pipe -vcodec ppm - | convert -delay 5 - output.gif");

Mais le code ci-dessus ne fait rien et aucun output.gif n'est généré.

Quelqu'un pourrait-il me faire savoir s'il existe un moyen clair de générer un quality gif using ffmpeg élevé?

Je suis tombé sur quelques tutoriels mais aucun d’entre eux n’a fonctionné pour moi et certains d’entre eux impliquent d’utiliser imagemagic auquel je n’ai pas accès.

6
David Hope

J'ai écrit un outil spécifiquement pour une qualité maximale:

https://gif.ski

ffmpeg -i video.mp4 frame%04d.png
gifski -o clip.gif frame*.png

Il génère de bonnes palettes par image, mais combine également des palettes à travers des images, réalisant même des milliers de couleurs par image.

Si vous souhaitez réduire les dimensions de la vidéo, ajoutez un filtre de mise à l'échelle:

ffmpeg -i video.mp4 -vf scale=400:240 frame%04d.png

Si vous souhaitez réduire la fréquence d'images, ajoutez le filtre fps:

ffmpeg -i video.mp4 -vf fps=12 frame%04d.png

Vous pouvez combiner les filtres avec -vf scale=400:240,fps=12

25
Kornel

Le problème clé est que chaque image ou cadre gif a un palette extrêmement limitée de seulement 256 des millions de couleurs possibles dans votre vidéo.

Ceci est bien expliqué ici.

Ainsi, assez récemment (2015, version 2.6) ffmpeg a obtenu les filtres palettegen et paletteuse qui peuvent générer de meilleures palettes pour chaque image.  

Par conséquent, assurez-vous que vous utilisez une version assez récente de ffmpeg.

Donc, il y a votre mot clé et votre mot clé de recherche pour vous permettre de créer des gifs de haute qualité en un rien de temps - étudiez-vous sur palettegen filters. Reddit méfiez-vous.

Quelques références:

Notes de version de ffmpeg 2.6

Documents de ffmpeg

superutilisateur

blog.phk.me

1
neonzeon
Shell_exec("/usr/bin/ffmpeg -i video.mkv -r 20 -f image2pipe -vcodec ppm - | convert -delay 5 - output.gif");

Je suppose que vous n'avez pas installéimageMagicksur votre environnement, car convert est l'un des outils de messagerie instantanée.

Quant aux artefacts vidéo, ils sont causés par la méthode de dithering par défaut dans FFmpeg. Pour obtenir de meilleurs résultats, je recommanderais floyd_steinberg ou sierra2_4a, et peut-être bayer avec une échelle définie à 3. (De plus, il n'y a pas d'éléments tels que des pixels énormes, ce sont les éléments atomiques des images raster.)

De l’autre côté, vous pouvez obtenir de meilleurs résultats avec ffmpeg uniquement. Tout d’abord, je générerais une palette de la vidéo en entrée:

ffmpeg -i <your_input.mkv> -filter_complex "fps=10;scale=500:-1:flags=lanczos,palettegen=stats_mode=full" -t 10 palette.png

Ensuite, utilisez ce modèle de couleur pour générer le fichier gif actuel:

ffmpeg -i <your_input.mkv> -i palette.png -filter_complex "[0]fps=10;scale=500:-1:flags=lanczos[scaled]; [scaled][1:v] paletteuse=dither=sierra2_4a" -t 10 <output.gif>

Vous devrez peut-être manipuler les paramètres et les méthodes de dithering pour obtenir les meilleurs résultats. Vous pouvez également essayer de générer une nouvelle palette pour chaque image. Vous pouvez ainsi ignorer le premier passage et utiliser l'option new dans le filtre paletteuse.

1
Gergely Lukacsy