视频转 GIF
浏览器本地 · 高质量 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 中直接预览,无需下载视频文件。
| 维度 | 本工具 | 竞品 A (EZGIF) | 传统方法 (FFmpeg 命令行) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 文件上传至服务器处理 | 本地处理,不涉及网络传输 |
| 处理速度 | 数秒内 (取决于文件大小与帧数) | 数秒至数十秒 (取决于服务器负载) | 数秒至数分钟 (取决于硬件与参数) |
| 离线可用 | 支持 (WASM 技术,加载后离线可用) | 不支持 (需联网) | 支持 (需预先安装 FFmpeg) |
| 操作门槛 | 零门槛,拖拽上传即可 | 低门槛,网页操作 | 高门槛,需记忆命令行参数 |
| 调色板优化 | 支持 (自动优化,减少颜色数量) | 支持 (可设置颜色数量) | 支持 (需手动指定 palettegen 参数) |
| 循环设置 | 支持 (可设置循环次数或无限循环) | 支持 (可设置循环次数) | 支持 (需手动指定 -loop 参数) |
| 收费模式 | 免费 | 免费 (有文件大小限制) | 免费 (开源软件) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| input.mp4 (时长 10 秒,分辨率 1920x1080,30fps) | output.gif (时长 10 秒,分辨率 480x270,10fps,文件大小 2.3MB,循环播放) | 典型场景:从短视频中截取片段转为 GIF,默认降低分辨率与帧率以控制体积 |
| input.mp4 (时长 3 秒,分辨率 640x480,24fps) + 输出帧率设为 24fps | output.gif (时长 3 秒,分辨率 640x480,24fps,文件大小 8.1MB,循环播放) | 典型场景:保留原始帧率与分辨率,适合需要高流畅度的短动画片段 |
| input.mp4 (时长 60 秒,分辨率 3840x2160,60fps) + 输出帧率设为 5fps | output.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) + 输出帧率设为 1fps | output.gif (时长 15 秒,分辨率 480x270,1fps,文件大小 350KB,循环播放) | 易错 case:帧率过低(≤2fps)导致动画卡顿,用户误以为工具故障 |
| input.mp4 (时长 120 秒,1920x1080,30fps) + 不调整任何参数 | output.gif (时长 120 秒,分辨率 1920x1080,30fps,文件大小 450MB,循环播放) | 易错 case:未调整参数直接转换,输出文件过大(>100MB),浏览器可能无法预览 |
ffmpeg -i input.mp4 output.gifffmpeg -i input.mp4 -vf "fps=10" output.gif视频通常 24-60fps,GIF 播放器大多只支持 10-15fps。不降帧率会导致文件巨大且浏览器播放卡顿。
ffmpeg -i input.mp4 output.gifffmpeg -i input.mp4 -vf "palettegen=stats_mode=diff[pal],[0:v][pal]paletteuse=dither=bayer:bayer_scale=5" output.gifGIF 格式只支持 256 色,但 FFmpeg 默认不会自动优化调色板。不指定 palettegen/paletteuse 会保留全色域,文件体积暴增 5-10 倍。
-loop 0-loop -1(FFmpeg 中 -1 表示无限循环)FFmpeg 的 -loop 参数:0 表示不循环(播放一次),-1 表示无限循环。很多用户误以为 0 是无限。
ffmpeg -i frame%04d.png output.gifffmpeg -i frame%04d.png -vf "palettegen[pal],[0:v][pal]paletteuse" output.gifPNG 是 24 位真彩色,GIF 是 8 位索引色。直接合成会强制抖动或丢失颜色,必须先生成调色板再映射。
ffmpeg -i 10min_video.mp4 output.gifffmpeg -ss 00:01:00 -t 5 -i 10min_video.mp4 output.gifGIF 是逐帧无损压缩,10 分钟视频转 GIF 文件可达数百 MB,浏览器无法加载。应先用 -ss -t 截取关键片段。
ffmpeg -i input.mp4 -vf "split[0][1];[0]palettegen[pal];[1][pal]paletteuse" output.gifffmpeg -i input.mp4 -vf "split[0][1];[0]palettegen=stats_mode=diff[pal];[1][pal]paletteuse=dither=floyd_steinberg" output.gifGIF 全局调色板只有 256 色,stats_mode=diff 让调色板优先覆盖帧间差异区域,dither 算法减少色带。
ffmpeg -i source.mov output.gifffmpeg -i source.mov -vf "scale=640:-1:flags=lanczos,fps=10" output.gif无损视频分辨率常为 4K 以上,直接转 GIF 会生成超大文件。必须先用 scale 降分辨率、lanczos 抗锯齿。
ffmpeg -i input_with_alpha.mov output.gifffmpeg -i input_with_alpha.mov -vf "alphaextract[alpha];[0:v][alpha]alphamerge" output.gifGIF 格式本身不支持 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 每帧不同色表),此时公式不成立。
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」下的其他工具