使用ffmpeg从电影文件创建的GIF文件大小非常大。

8

我使用下面的命令使用ffmpeg创建了一个GIF:

ffmpeg -i foo.mp4 -ss 00:00:18 -t 00:00:06 -pix_fmt rgb24 bar.gif

然而,生成的bar.gif文件大小超过300 MB,而电影文件foo.mp4只有约15 MB!

这是怎么回事?


1
你尝试过其他的 pix_fmt 选项吗? - Ryan Erickson
根据文档,我没有找到任何有用的选项。显然,我可能忽略了像你所说的一样的东西。你会推荐哪个选项?我只看到使用-window_size,但那并没有完全解决问题。 - dearN
大家好:请阅读@thirdender的聊天记录,他/她在其中提供了一个非常有用的链接 - dearN
另外一个非常有用的方法是通过执行以下操作来减小gif图像的大小:这里。换句话说: convert <image> -depth 8 -colors YY -type palette result.gif其中YY<256 - dearN
2个回答

7
这个问题的综合回答比较困难 :-p 简而言之,它取决于每种格式中压缩是如何完成的。
在GIF动画中,每一帧都是一个单独的GIF图像。然后将所有GIF图像存储在一个大的GIF文件中,并使用一定延迟播放帧的指令进行回放。为了优化帧,可以通过运行能够删除从一帧到下一帧的重复信息的程序来运行GIF(GIMP“动画优化”滤镜是这样做的好方法:GIMP - 简单动画)。
另一方面,像MP4这样的视频格式采用不同的方法。它们假设帧将是相似的,并仅存储两帧之间的差异。此外,每帧数据的数量被限制为开始压缩时给定的指定视频比特率。执行有损压缩以将视频文件降至所需比特率。为了进一步优化视频文件,大多数视频转码器都包括“双通编码”的选项。这会运行两次视频:第一次只收集有关文件中哪些部分更复杂的信息,然后第二次会更积极地压缩视频的每个不复杂的部分。
作为视频编码过程的一部分,GIF文件格式缺少许多其他优化。此外,值得指出的是,GIF动画将被限制为256色调色板,这可能会导致图像抖动。MP4使用类似于JPEG压缩的方法来处理视频帧(尽管还有针对视频的其他优化...旧的MJPEG格式基本上只是一堆JPEG图像,就像GIF动画是一堆GIF图像)。如果您可以提供有关您特定用例的更多信息,我们可能能够帮助您找到更好的解决方案。

关于我的使用情况,需要哪些信息?谢谢! - dearN
你打算在网站上使用GIF吗?如果是的话,你考虑过使用VIDEO标签吗? - thirdender
是的,到目前为止,在我的测试中VIDEO标签运作得非常好 :-p 但需要注意的是,在我的Ubuntu 12.04 Chromium浏览器中,如果我尝试显示一个视频但给浏览器错误的视频尺寸,会导致浏览器崩溃。此外,VIDEO标签还提供了使用一些备用HTML的机会。许多人在备用方案中包括基于Flash的播放器,或者只显示静态图像或动画GIF(这可能有助于解决问题,也可能无济于事 :-p)。现在有很多关于VIDEO标签的好文章。 - thirdender
所以你的意思是 ffmpeg ffmpeg -i foo.mp4 -ss 00:00:18 -t 00:00:06 -pix_fmt video bar.gif。我使用的是Ubuntu 11.10。 - dearN
嗯... VIDEO 标签出了什么问题?你能在 jsfiddle 上调整一下你使用的 HTML 吗? - thirdender
显示剩余2条评论

2

我同意你的观点,使用这个命令并不是最优的:

avconv -i input.mp4 -pix_fmt rgb24 output.gif

在进行此转换后,您可以按照以下步骤使用Gimp:

enter image description here


然后,您需要选择文件>导出为...,选择GIF格式,点击导出,勾选“作为动画”,并指定适当的帧延迟(您可以从图层窗口中的图层名称获取)。 - Harry Cutts

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