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:
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.
J'ai écrit un outil spécifiquement pour une qualité maximale:
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
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.
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:
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
.