视频转动态 GIF 的调色板路线
为什么 GIF 需要"调色板路线"
GIF 格式天生只有 256 色限制,而且没有压缩编码。如果直接把视频帧一帧一帧编码成 GIF 文件:
- 色彩会严重丢失(256 色 vs 视频的 1670 万色);
- 文件会非常大(没有有效压缩);
- 画面会有严重的色带和颗粒感。
FFmpeg 的调色板路线(palettegen + paletteuse) 是目前生成高质量 GIF 的标准方案。核心思路是两步:
- palettegen:先把所有要输出的帧解码,统计出整个视频序列里最有代表性的 256 种颜色,生成一张动态调色板 PNG;
- paletteuse:用这张调色板 PNG 把每一帧量化到 256 色,然后编码成 GIF。
这样每个视频都会有自己专属的调色板,颜色利用效率远高于用一张固定调色板。
ZenConverter 的 GIF 默认策略
| 参数 | 默认值 | 说明 |
|---|---|---|
| 时间范围 | 源视频前 30 秒 | 可以用裁剪范围自定义 |
| 帧率 | 30 fps | 高于源视频帧率会 drop frame |
| 最大帧数 | 900 | 30 秒 × 30 fps = 900 帧上限 |
| 短边分辨率 | 480 px | 可选 720 px 或原始尺寸 |
| 输出颜色数 | 256 | GIF 硬上限,没有选项 |
| 输出格式 | GIF | 动画 GIF,无音频 |
30 秒 / 30 fps / 900 帧这组数字是 GIF 的经验上限——再长的 GIF 文件会非常大,而且大多数社交平台(微信、Telegram、微博)对 GIF 文件大小有限制。ZenConverter 直接把这些作为默认值,省去用户猜。
时间范围的自定义
虽然默认是前 30 秒,但可以用裁剪范围(见裁剪页面)改:
- 指定从第 10 秒到第 40 秒的片段(30 秒总时长);
- 如果源视频只有 20 秒,从第 5 秒到第 20 秒(15 秒总时长),GIF 就生成这 15 秒;
- 超过 30 秒的裁剪范围会被自动截到 30 秒 + 900 帧上限。
分辨率选择
| 选项 | 最终短边 | 适用场景 |
|---|---|---|
| 480 px(默认) | 约 854×480(16:9) | 社交平台分享、微信表情素材 |
| 720 px | 约 1280×720 | 需要更清晰的展示,文件也更大 |
| 原始尺寸 | 源视频分辨率 | 谨慎使用——4K 视频转 GIF 会生成巨型文件 |
GIF 不保留的东西
- 音频:GIF 格式没有音频,ZenConverter 不做任何音频保留的尝试;
- 字幕:源视频内嵌的字幕不会被渲染到 GIF 上;
- 容器元数据:拍摄时间、GPS、旋转标记等都不会出现在 GIF 里;
- 动画时序:GIF 有自己的 frame delay,不会精确保留源视频的播放速度(30 fps → 每帧约 33ms,会略有误差)。
与其他 GIF 生成方案对比
| 方案 | 画质 | 文件大小 | 处理时间 | 本地 |
|---|---|---|---|---|
| ZenConverter palette 两步走 | 高 | 中等 | 中等 | ✅ |
FFmpeg 直接 -f gif | 低 | 小 | 快 | ✅ |
| 在线 GIF 工具 | 中 | 中 | 取决于上传 | ❌ |
| 桌面端 ScreenToGif | 高 | 中 | 快 | ✅ |
ZenConverter palette 路线的画质接近桌面端 ScreenToGif 这类专业工具,比大多数 Android 端的 GIF 应用好——因为那些应用经常用直接编码而不是 palette 路线。
快速上手
- 加视频 → 选"GIF"作为输出;
- 如果想截非前 30 秒的片段,点裁剪标记范围;
- 选分辨率(默认 480 px 通常够用);
- 开始 → 等 palettegen 生成调色板、paletteuse 编码 GIF。
整个过程走前台服务,可以锁屏后台跑。
相关页面
- 可视化裁剪与多段分割 —— GIF 也可以用裁剪
- 视频格式互转原理 —— FFmpeg 是底层引擎
- 图片格式互转 —— GIF 也可以转成图片或 ICO
