GIF 变速
调整 GIF 播放速度
GIF 加速/减速/调帧率
调整 GIF 播放速度
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
了解工具定位 · 使用场景 · 对比优势
短视频创作者或聊天表情包爱好者,从电影/动画截取的片段原本节奏偏慢,做成表情包后缺乏冲击力。本工具支持 2x-8x 加速,可将 3 秒片段压缩至 0.5 秒,保留关键帧的同时让表情包「爆梗」瞬间更紧凑,适合微信/QQ 斗图场景。
游戏玩家录制了 30 秒的团战击杀集锦,但原始素材节奏平缓,无法突出操作高潮。使用减速功能将关键击杀镜头降至 0.5x 慢放,同时保持其余部分正常速度,让观众看清技能连招细节,适合发到抖音/B站做高燃剪辑。
淘宝/拼多多商家拍摄了 5 秒的产品旋转展示 GIF,但文件体积过大(超过 5MB),导致详情页加载慢。本工具将帧率从 15fps 降至 8fps,同时保持画面流畅度,体积压缩至 1.2MB,适配移动端快速浏览,提升商品点击转化率。
在线教育讲师制作软件操作教程,需要将 60 秒的完整操作过程压缩到 15 秒内,同时保留每个点击动作的视觉可辨识度。本工具提供 4x 匀速加速,不跳帧不丢关键操作点,生成的教学 GIF 可直接嵌入课件 PPT,学生扫码即可观看。
宠物主人用手机抓拍到猫狗跳跃/打哈欠的瞬间,原始 GIF 播放太快看不清表情细节。使用 0.3x 超慢速功能,将 1 秒的跳跃动作延长至 3 秒,配合逐帧预览导出,生成「猫飞在空中」的搞笑慢动作,适合发朋友圈或宠物社群。
| 维度 | 本工具 | 竞品 A (ezgif.com) | 传统方法 (Photoshop) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 上传文件到服务器处理后下载 | 文件在本地电脑处理,不经过网络 |
| 处理速度 | 1-3 秒内完成(WASM 本地运算) | 5-15 秒(取决于上传速度和服务器负载) | 30 秒-5 分钟(需手动操作时间轴面板) |
| 离线可用 | 完全离线(加载后断网仍可用) | 必须联网 | 完全离线 |
| 大小限制 | 受浏览器内存限制(通常 50MB 以内) | 有上传文件大小限制(通常 100MB) | 仅受电脑内存和硬盘空间限制 |
| 收费 | 完全免费,无水印 | 免费,但处理大文件或高速率需付费 | 需购买正版 Photoshop 订阅(约 ¥200/月) |
| 操作门槛 | 上传即处理,无学习成本 | 上传后选择参数,操作简单 | 需掌握时间轴面板、帧延迟修改等技能 |
| 批量处理 | 单次处理一个文件 | 支持批量上传处理 | 可通过动作脚本实现批量处理 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 上传一个 2 秒的 GIF,速度设为 2 倍 | 生成一个 1 秒的 GIF | 典型场景:加速 GIF,时长减半 |
| 上传一个 2 秒的 GIF,速度设为 0.5 倍 | 生成一个 4 秒的 GIF | 典型场景:减速 GIF,时长加倍 |
| 上传一个 2 秒的 GIF,帧率从 10fps 改为 20fps | 生成一个 2 秒的 GIF,帧率变为 20fps | 典型场景:仅调整帧率,不改变时长 |
| 上传一个 2 秒的 GIF,速度设为 100 倍 | 生成一个约 0.02 秒的 GIF | 边界 case:极端加速,时长极短 |
| 上传一个 2 秒的 GIF,速度设为 0.01 倍 | 生成一个约 200 秒的 GIF | 边界 case:极端减速,时长极长 |
| 上传一个 2 秒的 GIF,帧率从 10fps 改为 1fps | 生成一个 2 秒的 GIF,帧率变为 1fps | 边界 case:极低帧率,画面卡顿 |
| 上传一个 2 秒的 GIF,速度设为 0 倍 | 工具提示:速度值必须大于 0 | 易错 case:零值无效,需输入正数 |
| 上传一个 2 秒的 GIF,速度设为 -1 倍 | 工具提示:速度值必须大于 0 | 易错 case:负值无效,需输入正数 |
加速倍数设为 0.1(极慢)或 20(极快)加速倍数设为 2(2 倍速)或 0.5(半速)GIF 帧延迟最小单位 10ms(部分浏览器 20ms),超出范围会导致播放异常或浏览器忽略设置
帧率设为 12.5 或 100帧率设为 12 或 50GIF 帧率实际由帧延迟(单位 10ms)控制,非整数帧率无法精确映射;过高帧率(>50)浏览器常无法正确渲染
上传一个 500 帧的动画 GIF上传前用其他工具裁剪帧数至 100 帧以内FFmpeg 处理大量帧时内存占用线性增长,浏览器 WASM 环境可能 OOM 或超时;后端处理也会显著增加等待时间
上传 .png 或 .mp4 文件到仅支持 GIF 的输入框先确认文件扩展名为 .gif,或使用格式转换工具转为 GIF 后再上传工具后端基于 GIF 格式解析帧结构,非 GIF 文件会直接解析失败或输出无意义结果
认为 2 倍速后文件体积减半理解变速主要改变帧延迟,不改变帧数;体积变化取决于帧间差异和优化算法GIF 体积由帧数、颜色表、压缩算法共同决定,单纯加速仅减少每帧显示时间,帧数不变时体积通常不会大幅缩小
输入 24 位真彩色 GIF,期望输出保持相同色彩精度接受输出 GIF 被限制为 256 色(8 位),或提前用工具做颜色量化GIF 格式本身只支持 256 色调色板,FFmpeg 默认使用全局调色板,色彩过渡区域可能出现条带伪影
上传文件名为「动画.gif」或「test (1).gif」重命名为「animation.gif」或「test_1.gif」部分浏览器/后端对非 ASCII 文件名处理不一致,可能导致解析失败或乱码;空格和括号在某些 URL 编码场景下引发问题
公式推导 · 流程图解 · 依据出处
T_new = T_old × (F_old / F_new)
T_new — 变速后的播放时长(秒)T_old — 原始 GIF 播放时长(秒)F_old — 原始帧率(fps)F_new — 目标帧率(fps)原始 GIF 时长 5 秒,帧率 10 fps,目标帧率 20 fps。则 T_new = 5 × (10 / 20) = 2.5 秒。加速至 2 倍速,时长缩短为 2.5 秒。
适用于通过调整帧率实现匀速变速的 GIF。若同时删除/插入帧(非均匀变速),需使用帧序列时间戳重映射公式。基于 FFmpeg setpts 滤镜原理。
3 种主流语言 · 复制即用
from PIL import Image, ImageSequence
# 读取 GIF,提取所有帧并记录每帧延迟
frames = []
durations = []
with Image.open("input.gif") as img:
for frame in ImageSequence.Iterator(img):
frames.append(frame.copy())
durations.append(frame.info.get("duration", 100)) # 默认 100ms
# 加速 2 倍:每帧延迟减半
speed_factor = 2.0
new_durations = [int(d / speed_factor) for d in durations]
# 保存为新 GIF
frames[0].save(
"output.gif",
save_all=True,
append_images=frames[1:],
duration=new_durations,
loop=0
)package main
import (
"image/gif"
"os"
)
func main() {
// 打开输入 GIF
f, _ := os.Open("input.gif")
defer f.Close()
g, _ := gif.DecodeAll(f)
// 减速 0.5 倍:每帧延迟加倍
speedFactor := 0.5
for i := range g.Delay {
g.Delay[i] = int(float64(g.Delay[i]) / speedFactor)
}
// 写入输出
out, _ := os.Create("output.gif")
defer out.Close()
gif.EncodeAll(out, g)
}const sharp = require('sharp');
// 使用 sharp 调整 GIF 帧率(需配合 ffmpeg 或 gifski)
// 此处演示用 sharp 提取帧并重新组合(简化版)
async function changeSpeed(inputPath, outputPath, speedFactor) {
// 读取 GIF 为 Buffer
const input = require('fs').readFileSync(inputPath);
// 提取所有帧(sharp 默认输出每帧 PNG)
const frames = await sharp(input, { animated: true })
.raw()
.toBuffer({ resolveWithObject: true });
// 实际场景需用 gifwrap 或 gifencoder 重新编码
// 此处仅示意:调整每帧延迟需解析 GIF 元数据
console.log(`帧数: ${frames.info.pages}`);
console.log(`调整速度: ${speedFactor}x`);
}
changeSpeed('input.gif', 'output.gif', 2.0);8 个高频疑问
「转 GIF」下的其他工具