70 votes

Pourquoi FFmpeg choisit-il 10+20+20 ms au lieu de 16 ms pour les images GIF à 60 fps ?

J'ai une courte vidéo de 60 fps que j'aimerais transformer en fichier GIF. J'exécute

ffmpeg -i foo.flv foo.gif

et cela produit un fichier GIF. Génial !

Le seul problème est que le mouvement dans la vidéo GIF produite est bizarre et irrégulier. Si j'utilise un autre outil, je peux voir que FFmpeg a créé une vidéo où la première image dure 10 ms, la deuxième 20 ms, la troisième 20 ms, puis ça se répète comme ça : 10 ms, 20 ms, 20 ms. Si j'utilise un autre outil pour lisser la vidéo à 16 ms pour chaque image (sans modifier le contenu des images), le résultat est magnifique.

Pourquoi FFmpeg fait-il cela ? Comment puis-je lui demander d'écrire un fichier GIF qui demande une fréquence égale de 16 ms par image, de sorte que je n'aie pas besoin d'utiliser un deuxième outil ?

J'ai maintenant vu ceci Question connexe demandant si les vidéos GIF à 60 images par seconde existent, mais il ne répond pas à la question de savoir comment demander à FFmpeg de changer son comportement. De plus, cela soulève une nouvelle question : si 16ms n'est pas un temps que le GIF peut représenter, que fait l'autre outil que j'utilise, et pourquoi fonctionne-t-il bien ?

84voto

Matt Rae Points 421

Comme indiqué à l'adresse Les GIF à 60 FPS existent-ils vraiment ? Ou bien le maximum est-il de 50 FPS ? La résolution des temps de trame dans les GIF est de 10 ms, ce qui ne permet pas d'obtenir un temps de trame régulier de 16 ms. Les réponses aux questions, dans l'ordre, sont donc les suivantes :

Pourquoi ffmpeg fait-il cela ?

Parce que 10+20+20 vous donne 60fps en moyenne, et c'est l'approximation la plus précise de cette propriété qui peut être représentée dans les contraintes du format GIF.

Comment puis-je lui demander d'écrire un gif qui demande une fréquence égale à 16 ms par image, de sorte que je n'aie pas besoin d'utiliser un deuxième outil ?

Vous ne pouvez pas, parce que le format gif ne peut pas représenter cela. Mais j'ai trouvé que lui demander de faire une vidéo à 50fps -- ce qui puede être représenté exactement dans le format GIF -- produit des résultats agréables et lisses. Cela peut être fait avec :

ffmpeg -i foo.flv -vf fps=50 foo.gif

Elle utilise l'interpolation temporelle du plus proche voisin pour choisir l'image à transférer à la sortie.

Si 16ms n'est pas un temps que le gif peut représenter, que fait l'autre outil que j'utilise, et pourquoi fonctionne-t-il bien ?

L'autre outil que j'utilisais était GIMP, et son choix est d'arrondir chaque image à la taille représentable la plus proche, donc il changeait silencieusement ma demande de 16ms/image en 20ms/image. Cela fonctionne probablement bien parce que mes pauvres yeux d'humain ne peuvent pas dire que tout se passe un peu trop lentement pour être correct ; seulement que les mouvements se font en douceur au lieu d'être anormalement espacés.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X