【问题标题】:How to generate gif from avi using ffmpeg? [closed]如何使用 ffmpeg 从 avi 生成 gif? [关闭]
【发布时间】:2011-08-30 01:34:33
【问题描述】:

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

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

它会生成一个动画 gif,但质量很差。但是,当我使用以下方法生成 gif 图像时:

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

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

【问题讨论】:

标签: ffmpeg


【解决方案1】:

我在尝试从电影中提取的一系列图像中生成高质量的动画 gif 时遇到了类似的问题。

由于某些原因,使用 ffmpeg 生成的动画 gif 仅包含 103 种颜色,可使用固定的 256 级系统调色板假设,导致可怕的结果。我的解决方案是

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

然后

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

质量非常好。你可以找到gifsiclehere

编辑:更新帖子以反映 Alex Kahn 的建议。

【讨论】:

  • 谢谢!一调整:用完%02d.gif。这会填充文件名中的数字,以便它们按正确的字母顺序排列。否则,顺序最终为 1,10,11,12,13,14,15,16,17,18,19,2,20,21,22,23... 这会给生成的 gif 带来奇怪的跳过效果。
  • 您也可以使用ffmpeg 输出 PNG 而不是 GIF,以避免质量不佳。 FWIW,这里有一篇关于在 Bash 中创建 GIFS 的精彩文章:blog.room208.org/post/48793543478
  • 这很好用。您可能还想做的一件事是跳过帧:在 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 帧停止。
  • 另外我建议下一步:convert -layers 优化anim.gif anim_opt.gif
  • gifsicle 看起来根本不起作用。响应您的命令时说“gifsicle.EXE: *.gif: Invalid argument”
【解决方案2】:

我之前没有制作过动画 GIF,但您可以尝试使用比特率参数来指定质量,尽管它是图像(并且可能没有速率)。缩略图质量响应 -b 参数。如果用 insane 来表示“非常糟糕”,您可以指定非常高的比特率和比特率容差(不确定您使用的是 vbr 还是 cbr 源)。 (或者如果你的意思是它太好了并且你想限制大小,就做相反的事情)

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

或者,您也可以使用 -s 参数更改尺寸,这将采用普通外观的尺寸表示,例如“1920X1200”。

这实际上取决于您的源材料的比特率和压缩率以及您希望 gif 的样子。也许考虑提供比“疯狂”更多的信息,但我想这会给你一个好的开始。祝你好运

【讨论】:

  • 感谢您的回复。但是我发现 ffmpeg 并不擅长处理 gif 图像,所以我用它来提取图像,然后使用 imagemagick 生成 gif。
  • 不知道为什么我在这里收到很多反对票。我事先声明我没有制作动画 GIF。试图将有问题的人指向其他相关参数。旧的 FFMPEG 项目似乎以将许多参数隐藏在文档之外而自豪。也许我因为揭露了它可怕的黑暗秘密而被否决了?
猜你喜欢
  • 2012-05-16
  • 2011-04-20
  • 1970-01-01
  • 2021-10-21
  • 2013-05-02
  • 2016-10-18
  • 2012-05-16
  • 2013-02-17
相关资源
最近更新 更多