J'étais chargé de réduire le temps nécessaire pour générer un fichier GIF animé aussi proche que possible de 30 images de long pour une largeur de 150 pixels. La plupart des séquences que nous générons ont moins de 1000 images. Nous avions une séquence de 15 000 images et nos noeuds de rendu prenaient 17 minutes pour produire ce fichier GIF de ~ 30 images, ce qui est trop lent.
Nous utilisions ffmpeg comme démultiplexeur et piping pour imagemagick. Après plusieurs heures d’expérimentation, je suis arrivé aux conclusions suivantes:
Le nombre de trames d' entrées que vous demandez ffmpeg à traiter est de loin la contribution la plus percutante en termes de vitesse d'exécution. Si l'utilisation du démultiplexeur concat pour ignorer les images en entrée est une option, cela fera la plus grande différence de performances. En prenant chaque cinquième image, j'ai été en mesure de réduire le temps de calcul total à 1 minute 45 secondes avec une mise à l'échelle des lanczos de haute qualité et un calcul de palette par image. La création de notre vignette d'aperçu à 30 images prend désormais moins d'une seconde .
L'algorithme de redimensionnement était le deuxième impact le plus important en termes de performances (mais loin derrière). L'utilisation de fast_bilinear au lieu de lanczos a permis de gagner 150 secondes de temps de calcul sur les 15 000 images.
La variable la moins impactante était le calcul de palette, et cela variait avec l'algorithme de redimensionnement. Avec plus de 15 000 images utilisant des lanczos, nous avons économisé environ 17 secondes de temps d’exécution en éliminant le calcul des palettes. Avec fast_bilinear, nous avons économisé environ 75 secondes de temps d'exécution.
Comme l’algorithme de redimensionnement et le calcul de la palette étaient négligeables, nous avons fini par les garder à la plus haute qualité. Nous avons réduit notre temps de calcul de 17 minutes à moins d'une seconde principalement en indiquant à ffmpeg de ne pas lire les fichiers d'entrée.
ENTRÉE CLÉ: CADRES D'ENTRÉE SAUTÉS vs CADRES DE SORTIE SAUTÉS
Notre processus prenait si longtemps parce que la suppression de trame n'aide pas le temps d'exécution lors de l'utilisation du démultiplexeur image2. Si vous utilisez le -r
drapeau et le fps
filtre, vous affecterez le nombre d'images apparaissant dans le fichier GIF final, mais ffmpeg semble toujours utiliser quelque chose avec les 15 000 images en entrée.
La seule façon pour moi de faire en sorte que ffmpeg ignore les trames d’entrée est d’utiliser le concat
démultiplexeur.
Voici comment je génère maintenant des vignettes GIF animées de haute qualité sur ma machine de développement en moins d'une seconde en ignorant les images d'entrée:
# create text file which describes the ~30 input frames we want ffmpeg to process
seq -f "file 'left_frames.%04g.jpg'" 10000 500 25000 > tmp.txt
# generate the animated gif using ffmpeg only
ffmpeg -f concat -i tmp.txt -filter_complex "scale=150:-1:flags=lanczos,split=2 [a][b]; [a] palettegen [pal]; [b] fifo [b]; [b] [pal] paletteuse" output.gif
[b]
étiquette. Quoi qu'il en soit, l'utilisation de la palette est environ 200⨉ plus lente à en juger par un test rapide. Ne pas l'utiliser du tout n'est pas une option pour vous?