ffmpeg - 拆分电影,使每个 GIF 都在特定文件大小之下

标签 ffmpeg gif avconv

问题

我想将一部长电影转换成一系列关于动画 GIF 的作品。

每个 GIF 必须小于 5MB。

有什么方法可以确定 GIF 在编码时有多大?

到目前为止的进展

我可以将电影分割成单独的帧:
ffmpeg -i movie.ogv -r 25 frameTemp.%05d.gif
然后我可以使用 convert从 ImageMagick 创建 GIF。但是,我找不到在运行命令之前确定可能的文件大小的方法。

或者,我可以将电影分成几 block :
ffmpeg -i movie.ogv -vcodec copy -ss 00:00:00 -t 00:20:00 output1.ogv
但我无法知道,当我 convert将文件转换为 GIF 将小于 5MB。

一个包含大量 Action 的 10 秒场景可能超过 5MB(糟糕!),而静态场景可能低于 5MB(不是问题,但效率不高)。

想法

我认为我想做的是将整个电影转换为 GIF,然后找到一种按文件大小拆分的方法。

查看 ImageMagick,我可以将 GIF 拆分为帧,但我看不到将其拆分为特定大小/长度的动画 GIF 的方法。

那么,这可能吗?

最佳答案

avconv 中目前没有“停止在这个文件大小”选项。我知道。当然,它可以很快被破解,但目前 libav项目不做快速破解,所以它可能会出现在 ffmpeg第一的。

除此之外,您还面临一个问题,即动画 gif 是一种非常古老的格式,因此会做一些相当奇怪的事情。让我解释一下它通常的工作方式:

  • 您从头到尾创建了一系列框架,并将它们彼此叠放。
  • 您使所有“ future ”帧不可见,并设置为在特定时间出现。
  • 为了使文件的大小更小,您查看新帧的“下方”,如果前一个像素相同,则将该特定像素设置为不透明。

  • 第三步是在动画 gif 中完成的唯一时间压缩,没有它,文件大小会大得多(因为必须一次又一次地保存每个像素)。

    但是,如果您不确定最后一次中断是什么时候,则无法确定像素是否与之​​前的“帧”相同。毕竟,这个特定的帧可能是图像中的第一个。

    如果 5MiB 的限制足够软,可以稍微超过它,您可能可以将一些东西放在一起,只是不断地逐帧添加,并立即计算最终文件大小。一旦超过限制,只需停止并使用下一帧作为下一个文件的起点。

    关于ffmpeg - 拆分电影,使每个 GIF 都在特定文件大小之下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24628412/

    相关文章:

    ffmpeg - 使用 ffmpeg/avconv 将音频与视频组合后,音频会移动 50 毫秒

    ffmpeg - ffprobe 或 avprobe 在 JSON 输出中返回纯文本错误

    python-3.x - 如何使用帧单元制作 TIME 字幕(.srt、.smi 等)

    java - 如何将fragmentpageradapter中每个tab的图标设置为gif动画?

    c - 仅对视频文件的部分进行 Remux 和分段,而输出没有差异

    javascript - 使用 JavaScript 制作 GIF 图像位置动画

    Imagemagick:如何减小具有大静态区域的动画 GIF 的大小?

    python - rawvideo image2pipe的ffmpeg和avconv之间的区别

    python - 子进程未创建 ffmpeg 命令的输出文件

    bash - ffmpeg 不适用于包含空格的文件名