视频转 GIF

调色板优化/帧率/循环

421 次访问
VIDEO TO GIF · GIF.JS

视频转 GIF

浏览器本地 · 高质量 GIF · 自定义帧率 / 尺寸 / 调色板

🎞️
点击 / 拖拽视频

使用建议

体积控制:GIF 比 MP4 大 5-10 倍。建议 ≤ 5 秒 + 480p + 15 FPS,否则体积可能 > 10MB。

质量参数:1 = 最高质量(慢,色彩准),30 = 最快(色彩损失大)。常用 10。

现代替代:发送到支持 WebM 的平台(如 Twitter / 微博)用视频,体积小 90%。

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎬

产品演示截取

产品经理或运营需要将 App 新功能的操作录屏(30 秒)转为 GIF,嵌入产品更新公告或用户手册。直接用原视频体积大、加载慢。本工具通过调色板优化减少颜色数、降低帧率至 10fps,输出 300KB 以内的循环 GIF,在网页端自动播放,用户打开页面就能看到操作演示,无需点击播放按钮。

💬

客服动图回复

电商客服遇到用户反复询问「怎么退换货」时,将操作步骤录屏转为 GIF 直接发送。原视频 5MB 微信发不出,用本工具将帧率降至 8fps、颜色数压缩至 128 色,输出 200KB 的循环动图,用户一眼看完整流程,减少打字解释的沟通成本。

📱

社交媒体表情包

短视频创作者从自己拍摄的搞笑片段中截取 2-3 秒高光时刻,转为 GIF 用于微博评论区或微信群聊。原视频色彩丰富、帧率高导致文件过大。本工具的调色板优化可保留关键颜色(如人脸肤色)同时压缩体积,循环播放功能让表情包自动重复,适合制造「魔性」效果。

🛠️

技术文档插图

开发者写 API 接口文档时,需要展示「点击按钮 → 弹出弹窗 → 输入参数」的交互流程。截图静态不直观,录屏视频嵌入文档需额外托管。用本工具将 5 秒录屏转为 GIF,帧率设为 12fps、循环播放,直接拖入 Markdown 或 Notion 文档,读者无需跳转外部视频链接即可理解操作步骤。

📊

数据看板快照

数据分析师需要将实时数据看板的动态变化(如仪表盘指针摆动、折线图逐月增长)录屏后发给团队。原视频包含大量冗余帧和不必要颜色。本工具通过降低帧率至 6fps 并启用调色板优化,保留关键数据点的颜色差异(如红色预警线),输出体积仅 150KB 的 GIF,在邮件或 Slack 中直接预览,无需下载视频文件。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (EZGIF)传统方法 (FFmpeg 命令行)
数据隐私纯浏览器处理,文件不上传服务器文件上传至服务器处理本地处理,不涉及网络传输
处理速度数秒内 (取决于文件大小与帧数)数秒至数十秒 (取决于服务器负载)数秒至数分钟 (取决于硬件与参数)
离线可用支持 (WASM 技术,加载后离线可用)不支持 (需联网)支持 (需预先安装 FFmpeg)
操作门槛零门槛,拖拽上传即可低门槛,网页操作高门槛,需记忆命令行参数
调色板优化支持 (自动优化,减少颜色数量)支持 (可设置颜色数量)支持 (需手动指定 palettegen 参数)
循环设置支持 (可设置循环次数或无限循环)支持 (可设置循环次数)支持 (需手动指定 -loop 参数)
收费模式免费免费 (有文件大小限制)免费 (开源软件)

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例8 个典型场景,覆盖常规、边界与易错

输入输出说明
input.mp4 (时长 10 秒,分辨率 1920x1080,30fps)output.gif (时长 10 秒,分辨率 480x270,10fps,文件大小 2.3MB,循环播放)典型场景:从短视频中截取片段转为 GIF,默认降低分辨率与帧率以控制体积
input.mp4 (时长 3 秒,分辨率 640x480,24fps) + 输出帧率设为 24fpsoutput.gif (时长 3 秒,分辨率 640x480,24fps,文件大小 8.1MB,循环播放)典型场景:保留原始帧率与分辨率,适合需要高流畅度的短动画片段
input.mp4 (时长 60 秒,分辨率 3840x2160,60fps) + 输出帧率设为 5fpsoutput.gif (时长 60 秒,分辨率 640x360,5fps,文件大小 15.4MB,循环播放)边界 case:超长超高清视频,大幅降帧降分辨率后体积仍可能偏大
input.mp4 (时长 0.5 秒,分辨率 100x100,15fps)output.gif (时长 0.5 秒,分辨率 100x100,15fps,文件大小 45KB,循环播放)边界 case:极短视频(<1 秒),输出文件极小,适合做表情包素材
input.mp4 (单色背景,纯色填充动画,时长 5 秒,30fps)output.gif (时长 5 秒,分辨率 320x180,10fps,文件大小 120KB,循环播放)边界 case:画面内容简单(大面积纯色),调色板优化后体积显著减小
input.mp4 (包含渐变、噪点、复杂纹理,时长 8 秒,24fps)output.gif (时长 8 秒,分辨率 480x270,8fps,文件大小 6.7MB,循环播放)易错 case:复杂画面会导致 GIF 颜色数不足(256 色限制),出现色块与条纹
input.mp4 (时长 15 秒,30fps) + 输出帧率设为 1fpsoutput.gif (时长 15 秒,分辨率 480x270,1fps,文件大小 350KB,循环播放)易错 case:帧率过低(≤2fps)导致动画卡顿,用户误以为工具故障
input.mp4 (时长 120 秒,1920x1080,30fps) + 不调整任何参数output.gif (时长 120 秒,分辨率 1920x1080,30fps,文件大小 450MB,循环播放)易错 case:未调整参数直接转换,输出文件过大(>100MB),浏览器可能无法预览

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 源视频帧率过高直接转成 GIF

错误
ffmpeg -i input.mp4 output.gif
修复
ffmpeg -i input.mp4 -vf "fps=10" output.gif

视频通常 24-60fps,GIF 播放器大多只支持 10-15fps。不降帧率会导致文件巨大且浏览器播放卡顿。

2. 不限制调色板颜色数导致文件过大

错误
ffmpeg -i input.mp4 output.gif
修复
ffmpeg -i input.mp4 -vf "palettegen=stats_mode=diff[pal],[0:v][pal]paletteuse=dither=bayer:bayer_scale=5" output.gif

GIF 格式只支持 256 色,但 FFmpeg 默认不会自动优化调色板。不指定 palettegen/paletteuse 会保留全色域,文件体积暴增 5-10 倍。

3. 循环次数设为 0 却期望无限循环

错误
-loop 0
修复
-loop -1(FFmpeg 中 -1 表示无限循环)

FFmpeg 的 -loop 参数:0 表示不循环(播放一次),-1 表示无限循环。很多用户误以为 0 是无限。

4. 用 PNG 序列帧直接合成 GIF 不调色板

错误
ffmpeg -i frame%04d.png output.gif
修复
ffmpeg -i frame%04d.png -vf "palettegen[pal],[0:v][pal]paletteuse" output.gif

PNG 是 24 位真彩色,GIF 是 8 位索引色。直接合成会强制抖动或丢失颜色,必须先生成调色板再映射。

5. 把长视频(>30 秒)直接转成 GIF

错误
ffmpeg -i 10min_video.mp4 output.gif
修复
ffmpeg -ss 00:01:00 -t 5 -i 10min_video.mp4 output.gif

GIF 是逐帧无损压缩,10 分钟视频转 GIF 文件可达数百 MB,浏览器无法加载。应先用 -ss -t 截取关键片段。

6. 忽略 GIF 的全局调色板限制

错误
ffmpeg -i input.mp4 -vf "split[0][1];[0]palettegen[pal];[1][pal]paletteuse" output.gif
修复
ffmpeg -i input.mp4 -vf "split[0][1];[0]palettegen=stats_mode=diff[pal];[1][pal]paletteuse=dither=floyd_steinberg" output.gif

GIF 全局调色板只有 256 色,stats_mode=diff 让调色板优先覆盖帧间差异区域,dither 算法减少色带。

7. 使用无损视频源(如 ProRes)直接转 GIF

错误
ffmpeg -i source.mov output.gif
修复
ffmpeg -i source.mov -vf "scale=640:-1:flags=lanczos,fps=10" output.gif

无损视频分辨率常为 4K 以上,直接转 GIF 会生成超大文件。必须先用 scale 降分辨率、lanczos 抗锯齿。

8. 期望 GIF 支持半透明或 Alpha 通道

错误
ffmpeg -i input_with_alpha.mov output.gif
修复
ffmpeg -i input_with_alpha.mov -vf "alphaextract[alpha];[0:v][alpha]alphamerge" output.gif

GIF 格式本身不支持 Alpha 通道。如果源视频有透明背景,只能通过 alphaextract 提取为黑白蒙版,或改用 APNG/WebP。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

N_{colors} = \min(256, \lfloor \frac{W \times H \times F \times D}{K} \rfloor)

变量说明

  • N_{colors} — 调色板颜色数(≤256)
  • W — 视频宽度(像素)
  • H — 视频高度(像素)
  • F — 帧率(fps)
  • D — 时长(秒)
  • K — 压缩系数(经验值 3~8)

示例

一段 640×360、30fps、10 秒的视频,K 取 5。总像素帧数 = 640×360×30×10 = 69,120,000。N = min(256, 69,120,000 / 5) = min(256, 13,824,000) = 256。调色板使用完整 256 色。若视频为 80×60、15fps、2 秒,K 取 5:总像素帧数 = 80×60×15×2 = 144,000。N = min(256, 144,000 / 5) = min(256, 28,800) = 28,800,但实际调色板上限为 256,故仍取 256。

适用范围

适用于 FFmpeg 调色板优化(palettegen/paletteuse)的通用颜色量化。K 值基于经验,低运动场景取 3~5,高运动场景取 6~8。不适用于逐帧独立调色板(如 GIF 每帧不同色表),此时公式不成立。

原理图

视频转GIF 流程上传视频选择文件设置参数FFmpeg 处理调色板优化帧率/循环生成 GIF预览效果下载文件关键参数说明调色板优化:减少颜色数量,控制文件大小帧率:每秒截取帧数,影响流畅度与体积
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import subprocess

# 使用 FFmpeg 将视频转为 GIF,调色板优化、帧率 10、无限循环
input_video = "input.mp4"
output_gif = "output.gif"

# 第一步:生成调色板
palette_cmd = [
    "ffmpeg", "-i", input_video,
    "-vf", "fps=10,scale=320:-1:flags=lanczos,palettegen",
    "-y", "palette.png"
]
subprocess.run(palette_cmd, check=True)

# 第二步:用调色板生成 GIF
gif_cmd = [
    "ffmpeg", "-i", input_video, "-i", "palette.png",
    "-filter_complex", "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse",
    "-loop", "0",  # 0 = 无限循环
    "-y", output_gif
]
subprocess.run(gif_cmd, check=True)

print(f"GIF 已生成:{output_gif}")
package main

import (
	"fmt"
	"os/exec"
)

func main() {
	input := "input.mp4"
	output := "output.gif"
	palette := "palette.png"

	// 生成调色板
	paletteCmd := exec.Command("ffmpeg",
		"-i", input,
		"-vf", "fps=10,scale=320:-1:flags=lanczos,palettegen",
		"-y", palette,
	)
	if err := paletteCmd.Run(); err != nil {
		panic(err)
	}

	// 用调色板生成 GIF,循环次数 0 表示无限
	gifCmd := exec.Command("ffmpeg",
		"-i", input, "-i", palette,
		"-filter_complex", "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse",
		"-loop", "0",
		"-y", output,
	)
	if err := gifCmd.Run(); err != nil {
		panic(err)
	}

	fmt.Printf("GIF 已生成:%s\n", output)
}
const { execSync } = require('child_process');
const path = require('path');

const input = 'input.mp4';
const output = 'output.gif';
const palette = 'palette.png';

// 生成调色板
execSync(`ffmpeg -i ${input} -vf "fps=10,scale=320:-1:flags=lanczos,palettegen" -y ${palette}`);

// 用调色板生成 GIF,-loop 0 表示无限循环
execSync(`ffmpeg -i ${input} -i ${palette} -filter_complex "fps=10,scale=320:-1:flags=lanczos[x];[x][1:v]paletteuse" -loop 0 -y ${output}`);

console.log(`GIF 已生成:${output}`);

常见问题

8 个高频疑问

为什么转换后的 GIF 图片颜色看起来很奇怪,和视频里不一样?
GIF 格式最多只支持 256 种颜色(8 位色深),而视频通常是 1600 万色(24 位)。工具默认使用 FFmpeg 的调色板优化算法,从视频帧中提取最常用的 256 色生成调色板,但复杂场景(如渐变天空、人物肤色)必然会有色块和抖动。可以尝试在转换前手动降低视频分辨率或增加帧间隔(每 N 帧取一帧),减少颜色丢失。如果对颜色要求高,建议改用 APNG 或 WebP 格式。
转换出来的 GIF 文件太大,怎么压缩到更小?
GIF 文件大小主要由帧数、分辨率和颜色数量决定。可以在工具中尝试三个操作:1)降低输出分辨率(如 1920×1080 降到 640×360,体积可缩小 80% 以上);2)减少帧率(如 30fps 降到 10fps,体积约缩小 2/3);3)开启调色板优化中的颜色数限制(如从 256 色降到 128 色)。注意:帧率降低后动画会变卡,建议保留 8-15fps 作为平衡点。
视频转 GIF 支持哪些视频格式?MP4、MOV、AVI 都行吗?
工具底层使用 FFmpeg 处理,理论上支持 FFmpeg 能解码的所有常见格式:MP4(H.264/H.265)、MOV、AVI、WebM、FLV、MKV、WMV 等。但实际受浏览器上传限制,建议用 MP4 或 WebM 格式,兼容性最好。如果遇到不支持的格式,可以先本地用格式工厂或 FFmpeg 命令行转成 MP4 再上传。注意:不支持加密/DRM 保护的视频文件。
转换后的 GIF 动图在微信里不会动,只显示静态图片,怎么办?
微信内测版和部分旧版本对 GIF 支持有限制:文件超过 1MB 或帧数超过 300 帧时,微信会自动转为静态图。解决方法:1)在工具中降低分辨率或帧率,将输出文件控制在 1MB 以内;2)缩短视频片段(建议不超过 10 秒,帧率 10fps 时约 100 帧);3)不要直接用微信发送原文件,而是先保存到手机相册,再从相册发送——相册中的 GIF 文件在微信中通常能正常播放。
为什么我上传视频后一直卡在‘处理中’不动?
可能原因和对应处理:1)视频文件太大(超过 100MB),浏览器上传或 FFmpeg 处理会超时——建议先截取 10-30 秒小片段再上传;2)视频编码格式不常见(如 AV1 或 ProRes),FFmpeg 解码慢——可以先转成 H.264 格式;3)浏览器标签页被后台挂起——尝试保持标签页在前台,或换用 Chrome/Edge 浏览器。如果持续卡住,刷新页面重新上传即可,不会重复计算。
这个工具是纯浏览器端处理还是会上传到服务器?处理时间大概多久?
工具优先使用浏览器端(WASM + FFmpeg)处理,视频不上传服务器,处理速度取决于本地电脑性能。对于 10 秒 1080p 视频,i5 处理器 + 16GB 内存的电脑大约需要 15-30 秒。如果浏览器不支持 WASM 或内存不足(比如旧手机浏览器),会自动回退到服务器端处理,此时视频会上传。服务器端处理速度更快(约 5-10 秒),但建议敏感视频尽量用浏览器端模式。
我想把视频某一段截成 GIF,工具支持选择起止时间吗?
支持。工具提供时间轴选择器或手动输入起止时间(精确到 0.1 秒)。如果不设置,默认从视频第 0 秒开始到视频结束。建议:1)先预览视频确认要截取的片段;2)起止时间差值建议在 3-15 秒之间——太长会导致 GIF 文件过大且播放卡顿;3)如果视频本身很长(如 1 小时),建议先用其他工具截取小片段再上传,减少浏览器处理压力。
转换后的 GIF 可以设置循环播放次数吗?比如只播放一次或无限循环?
可以。工具提供循环次数选项:0 表示无限循环,1 表示播放一次后停止,2 表示播放两次后停止,以此类推。GIF 规范中循环次数信息写入文件头部的 NETSCAPE 扩展块,所有主流浏览器和聊天软件都支持识别。注意:微信和 QQ 对无限循环 GIF 有时会强制停止在最后一帧,建议在发送前用工具预览确认效果。
选择 打开 +新窗口 esc关闭