文章

GIF 转 MP4:体积直接砍掉 90%(以及 GIF 为什么这么大)

五秒 GIF 动辄十兆,同样动画转成 MP4 往往不到一兆。本文讲清 GIF 没有运动压缩为什么这么胀、什么时候该转成视频,以及怎样读出每帧延时再重采样,避免动作被拉成匀速。转换可在浏览器里做完;发短视频时,MP4 也比 GIF 更不容易被压糊,动图也不用先上传。

GIF 转 MP4:体积直接砍掉 90%(以及 GIF 为什么这么大)

一个五秒的 GIF 动图,体积经常是 8~15MB。同样的动画编成 MP4,通常不到 1MB

这不是零头上的差别,而是差了大约十倍。这也正是 X、微博、Instagram 和多数现代网站在你上传 GIF 的瞬间就悄悄把它转成视频的原因。

这篇讲清这个差距从哪来、什么时候该转、以及多数转换工具都会搞砸的那个细节。


1. GIF 为什么这么大

GIF 的压缩方案在 1989 年就定稿了,此后再没变过。

由此带来两个后果,合起来就解释了全部的体积问题:

GIF 没有帧间压缩。 现代视频编码存的是帧与帧之间的差异——如果一帧里有 90% 和上一帧完全相同,这 90% 几乎不占空间。GIF 在真正要紧的这个层面上没有这个概念,每一帧基本都是当作一张独立图片存下来的。

GIF 每帧最多 256 种颜色。 为了让照片类画面在 256 色下看得过去,编码器要用抖动——把可用颜色的像素打散排布,去「假装」出缺失的颜色。而抖动会产生细密的噪点,噪点恰恰是世界上最难压缩的东西。为绕开一个限制而用的手段,反过来加剧了另一个限制。

H.264 这两个问题都没有:它跨帧压缩,也原生支持上千万种颜色。


2. 什么时候该转,什么时候不该

该转成 MP4:

  • 文件要放到网站上——首屏一个 10MB 的 GIF 对加载速度是灾难
  • 要发到 X、微博、Reddit,反正它们也会自己转成视频
  • 动画超过三秒左右,或者内容是照片类画面
  • 文件因为体积被拒收

该保留 GIF:

  • 要放进邮件——多数邮件客户端至今不播视频,但会播 GIF 动图
  • 需要在你控制不了的环境里零配置自动播放并循环
  • 只是个很小的界面动效,体积差就几百 KB,不值得折腾
  • 目标是明确要 GIF 的聊天表情位

说白了:GIF 活到今天靠的是自动播放、自动循环和到处都能用,而不是画质或体积。


3. 多数转换工具搞砸的细节:逐帧节奏

这一段值得看懂,因为它区分了「转对了」和「转坏了」。

GIF 会为每一帧单独存一个延时。 GIF 并不要求恒定帧率,实际上很多都不是——一个手工做的 GIF 可能第一帧停 2 秒,中间 12 帧每帧 40 毫秒,最后一帧再停 1.5 秒。

粗糙的转换工具只读帧数,假设它是恒定帧率,然后把时间平均分配。结果就是播放速度不对,所有刻意的停顿全没了

正确的做法是读出每一帧各自的延时,还原出真实的时间轴,再按输出帧率对这条时间轴重采样。这样动作的原有节奏才能保住。

我们的 GIF 转 MP4 工具就是这么做的——逐帧读取延时,先还原时间轴再编码。


4. 操作步骤

  1. 把 GIF 拖进来。 帧数、逐帧延时和总时长都在本地读出。
  2. 选帧率。 24fps 是不错的默认值。设得比 GIF 本身的有效帧率还高,只会增加体积而不增加信息。
  3. 设输出尺寸。 100% 保持原尺寸。放大是可以,但不会凭空多出细节。
  4. 选背景色。 MP4 没有透明通道,所以 GIF 里的透明区域会被填色——按视频最终展示的位置选黑或白。
  5. 需要的话设重复次数。 有些平台拒收三秒以下的片子,把短 GIF 重复两三遍是最省事的办法。
  6. 转换并下载。

5. 常见问题

转成 MP4 之后还会循环吗? 循环是播放器的设置,不是存在文件里的属性。放网页上就给 <video>loop 属性;社交平台上短视频会自动循环。这是转换之后主要会失去的东西。

实际能小多少? 典型的动图能小 80%~90%。我们自己实测过一个 40 帧、320×320 的 GIF,从 820KB 降到 87KB,小了 89%,肉眼看不出画质差别。照片类的 GIF 省得最多;纯色块动画省得少一些,因为那种内容 GIF 本来就压得还行。

转换会掉画质吗? 通常反而观感更好。GIF 本来就已经被量化到 256 色并做过抖动了;MP4 不会把丢掉的颜色变回来,但也不会再来一轮 256 色压缩,而且那些抖动噪点会被压掉。

能反过来把 MP4 转成 GIF 吗? 可以,但体积代价要再付一次。我们的视频转 GIF 工具处理这个方向,帧率、宽度和抖动算法都能调。

为什么导出的是 WebM 而不是 MP4? H.264 编码依赖浏览器支持。Firefox 和部分 Linux 版本没有提供,此时会回落到 VP9 编码的 WebM。除了旧版 Safari,现代浏览器都能播放。


相关阅读