如何使用ffmpeg从avi生成gif?

52

我正在尝试使用以下命令将视频的一部分提取为动画gif:

ffmpeg -i video.avi -t 5 out.gif

它生成了一个动态gif图像,但质量很差。然而,当我使用以下命令生成gif图像时:

ffmpeg -i video.avi -t 10 out%d.gif

它生成了可接受的gif图像质量。如何使用第一个命令生成动画gif图像,但保持与第二个命令相同的质量?


2
这可能很方便 http://blog.pkh.me/p/21-high-quality-gif-with-ffmpeg.html - Matthew Lock
2个回答

67

我曾尝试从一部电影提取多个图像,生成高质量的动态gif时,遇到了类似的问题。

由于某些原因,使用ffmpeg生成的动态gif仅包含103种颜色,这些颜色是在一个固定的256级系统调色板中假定的,导致效果极其恶劣。我的解决方案是

ffmpeg -i video.avi -t 10 out%02d.gif

那么

gifsicle --delay=10 --loop *.gif > anim.gif

质量相当不错。你可以在这里找到gifsicle。

编辑:根据Alex Kahn的建议更新了帖子。


7
谢谢!需要做一个调整:使用out%02d.gif。这样可以对文件名中的数字进行填充,以便按照正确的字母顺序排序。否则,排序顺序会变成1、10、11、12、13、14、15、16、17、18、19、2、20、21、22、23... 这会导致生成的gif动画出现奇怪的跳帧效果。 - Alex Kahn
2
你也可以让 ffmpeg 输出 PNG 而不是 GIF,以避免劣质的质量。顺便说一下,这里有一篇关于在 Bash 中创建 GIF 的好文章:http://blog.room208.org/post/48793543478 - Mathias Bynens
1
这很好用。你可能还想要做的一件事是跳过帧:在gifsicle命令中使用seq -f %02g.gif start skip stop而不是*.gif,你可以跳过skip帧,从start开始到stop帧结束。非常有用。例如:gifsicle --delay=10 --loop `seq -f %02g.gif 1 3 156` > anim.gif将从第1帧开始,跳过3帧,并在第156帧停止。 - funkaster
另外,我建议下一步是:将-layers Optimize anim.gif anim_opt.gif 进行转换。 - Marat Buharov
1
"gifsicle"似乎完全无法工作。在响应您的命令时,它会显示“gifsicle.EXE:*.gif:参数无效”。 - Dims
显示剩余2条评论

0

我以前没有制作过动画GIF,但您可以尝试使用比特率参数来指定质量,尽管它是一张图片(并且可能没有速率)。缩略图质量响应于-b参数。如果您所说的“疯狂”是指“糟糕透顶”,则可以指定非常高的比特率和比特率容差(不确定您是否使用vbr或cbr源)。 (或者如果您认为它太好了并且想要限制大小,则相反)

'-b','10000000','-bt','20000000'

另外,您还可以使用-s参数更改尺寸,该参数将采用普通的尺寸表示方式,例如“1920X1200”。

这实际上取决于您的源材料的比特率和压缩以及您希望GIF的效果如何。也许考虑提供比“疯狂”更多的信息,但无论如何,我想这都会给您一个良好的开端。祝你好运


2
谢谢您的回复。然而,我发现ffmpeg在处理gif图像方面并不是很好,所以我使用它来提取图像,然后使用imagemagick生成gif。 - Marconi
不确定为什么我在这里收到了很多负评。我一开始就说过我没有制作动画gif。我只是试图将问题的人指向其他相关参数。旧版FFMPEG项目似乎以将其许多参数隐藏在文档之外而自豪。也许我因为揭示了它可怕的黑暗秘密而被贬低了? - Profane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接