GIF 倒放
GIF 动图反向播放
GIF 反向播放/无损
GIF 动图反向播放
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
了解工具定位 · 使用场景 · 对比优势
B站鬼畜区UP主需要将一段正常动作的GIF倒放,制造出“反重力”“时间回溯”的喜剧效果。传统方法需要逐帧拆解再反向拼接,耗时且画质损失大。本工具一键无损倒放,保留原始帧率与色彩,让鬼畜素材的创作效率提升5倍以上。
体育教练或物理教师分析运动员的起跳动作时,倒放GIF能清晰展示落地瞬间的肢体角度与重心变化。本工具无损倒放后,帧序列保持原样,便于逐帧对比正反向动作差异,辅助纠正技术细节,比视频倒放更轻量、更直观。
微博/抖音用户看到一段“液体倒流”“烟雾回收”的趣味GIF,想自己制作同款反转效果。本工具无需下载软件,浏览器上传即可生成,支持微信/QQ直接分享。倒放后的GIF保持原尺寸与文件大小,方便在朋友圈快速传播。
游戏测试员录制了一段角色卡进墙里的GIF,但需要倒放来展示“从墙里弹出来”的异常过程。本工具无损处理,不压缩画质,倒放后帧序列完全反转,便于在Bug报告中清晰标注异常帧位置,比录屏软件自带的倒放功能更精准。
科普博主制作“水珠逆重力上升”“火焰向内收缩”等反常识GIF,用于解释表面张力或燃烧原理。本工具支持高帧率GIF的无损倒放,保留原始颜色深度,避免多次转换导致的色阶断层,让科学演示的视觉说服力更强。
| 维度 | 本工具 | 竞品 A (ezgif.com) | 传统方法 (Photoshop / 手动) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不离开本地 | 上传到服务器处理 | 文件完全在本地,但依赖操作者设备 |
| 处理速度 | 1-3 秒 | 5-15 秒(含上传下载时间) | 1-5 分钟(含导入导出及手动操作) |
| 离线可用 | 支持(WASM 本地运算) | 不支持,必须联网 | 支持(需安装软件) |
| 文件大小限制 | 受浏览器内存限制(通常 < 50 MB) | 通常限制 100 MB 或 200 帧 | 无限制(取决于设备性能) |
| 操作复杂度 | 一步完成,上传后自动倒放 | 需上传 → 选择功能 → 下载 | 需导入帧 → 反向排列 → 导出 |
| 收费 | 免费 | 免费(有高级付费版去水印) | 付费(Photoshop 订阅制) |
| 平台依赖 | 任何现代浏览器 | 任何现代浏览器 | 需安装 Photoshop(仅桌面端) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| https://example.com/animation.gif | 倒放后的 GIF 文件(下载链接) | 典型场景:用户上传一个网络 GIF 链接 |
| 本地文件(小于 10MB 的 GIF) | 倒放后的 GIF 文件(下载链接) | 典型场景:用户从本地上传 GIF 文件 |
| 本地文件(大于 50MB 的 GIF) | 处理超时或内存不足提示 | 边界 case:超大文件导致浏览器端处理失败 |
| 本地文件(帧数超过 500 帧的 GIF) | 倒放后的 GIF 文件(帧顺序反转) | 边界 case:高帧数 GIF 验证倒放逻辑正确性 |
| 本地文件(单帧静态 GIF) | 原文件(无变化) | 边界 case:单帧 GIF 倒放前后无差异 |
| 非 GIF 格式(如 .png 或 .mp4) | 格式不支持提示 | 易错 case:用户误传非 GIF 格式文件 |
| 本地文件(包含透明背景的 GIF) | 倒放后的 GIF 文件(透明背景保留) | 典型场景:验证无损倒放保留透明度 |
上传一个 .mp4 或 .webp 文件到工具上传扩展名为 .gif 的 GIF 文件工具仅处理 GIF 格式;FFmpeg 虽能读取其他格式,但本工具设计为纯 GIF 倒放,非 GIF 输入会触发解码失败或输出异常
上传一个 500 帧、每帧 1920×1080 的大 GIF使用帧数 ≤ 200、分辨率 ≤ 800×600 的 GIFWASM 版 FFmpeg 在浏览器内解码,帧数和分辨率过高会耗尽内存(Chrome 单 Tab 通常 2GB 限制),导致页面无响应或崩溃
原 GIF 1.2MB,倒放后得到 3.8MB 就认为工具出错理解倒放后文件大小可能变化,尤其是原 GIF 有优化(如 LZW 压缩方向性)时GIF 压缩算法(LZW)对重复模式敏感;倒放后帧间差异模式改变,压缩率可能降低,文件变大属正常现象
上传一个显示不全或有色块的损坏 GIF 文件先使用 GIF 修复工具修复损坏文件,再上传倒放FFmpeg 解码损坏 GIF 时会丢弃异常帧或输出空白帧,倒放结果同样损坏;工具不包含修复逻辑
期望工具把 GIF 左右镜像(水平翻转)确认工具功能为时间轴反向播放,如需镜像请使用其他视频/图像翻转工具倒放(reverse)是时间域操作,镜像(flip/mirror)是空间域操作;两者完全不同,工具名已明确说明
上传带透明区域的 GIF,倒放后背景变黑或变白确认原 GIF 使用索引色透明(GIF 规范支持),倒放后透明度应保留;若丢失则检查原图是否用了非标准透明GIF 透明度基于单色索引(通常索引 0);FFmpeg 倒放时若调色板处理不当会丢失透明色,建议使用标准工具生成的原图
下载倒放 GIF 后直接导入 Photoshop 继续编辑,发现帧顺序混乱将倒放 GIF 视为最终产物,如需编辑应保留原始 GIF 并重新倒放倒放后的 GIF 帧顺序已反向,再次编辑时帧编号与时间轴对应关系改变,容易混淆
公式推导 · 流程图解 · 依据出处
GIF 倒放:将帧序列 F[0], F[1], ..., F[N-1] 重新排列为 F[N-1], F[N-2], ..., F[0]
F[i] — 原始 GIF 的第 i 帧图像数据N — GIF 的总帧数一个 3 帧 GIF,帧顺序为 A→B→C。倒放后帧顺序变为 C→B→A。若原 GIF 播放时长为 1.5 秒(每帧 0.5 秒),倒放后时长不变,仍为 1.5 秒,但动作反向。
适用于所有标准 GIF 格式(帧延迟固定或可变)。不支持跨帧混合(如透明度叠加)的 GIF,此类 GIF 倒放后视觉可能异常。
3 种主流语言 · 复制即用
from PIL import Image, ImageSequence
import io
# 读取 GIF,提取每一帧
with Image.open("input.gif") as img:
frames = [frame.copy() for frame in ImageSequence.Iterator(img)]
# 反转帧顺序
frames.reverse()
# 保存为倒放 GIF(保留原帧延迟)
# 使用第一帧作为基础,追加其余帧
duration = img.info.get("duration", 100) # 默认 100ms
frames[0].save(
"output.gif",
save_all=True,
append_images=frames[1:],
duration=duration,
loop=0,
disposal=img.info.get("disposal", 2)
)
print("已生成 output.gif")package main
import (
"image/gif"
"os"
)
func main() {
// 读取原始 GIF
f, _ := os.Open("input.gif")
defer f.Close()
g, _ := gif.DecodeAll(f)
// 反转帧序列
for i, j := 0, len(g.Image)-1; i < j; i, j = i+1, j-1 {
g.Image[i], g.Image[j] = g.Image[j], g.Image[i]
g.Delay[i], g.Delay[j] = g.Delay[j], g.Delay[i]
}
// 写入倒放结果
out, _ := os.Create("output.gif")
defer out.Close()
gif.EncodeAll(out, g)
}const fs = require('fs');
const { GifReader, GifWriter } = require('omggif');
// 读取原始 GIF 文件
const buf = fs.readFileSync('input.gif');
const reader = new GifReader(buf);
// 提取所有帧数据(RGBA 像素)
const frames = [];
for (let i = 0; i < reader.numFrames(); i++) {
const pixels = new Uint8Array(reader.width * reader.height * 4);
reader.decodeAndBlitFrameRGBA(i, pixels);
frames.push({
pixels,
delay: reader.frameInfo(i).delay * 10 // omggif 延迟单位是 10ms
});
}
// 反转帧顺序
frames.reverse();
// 写入倒放 GIF
const writer = new GifWriter(Buffer.alloc(reader.width * reader.height * 4 * frames.length + 1000), reader.width, reader.height, { loop: 0 });
frames.forEach((f, idx) => {
writer.addFrame(0, 0, reader.width, reader.height, f.pixels, { delay: f.delay / 10 });
});
fs.writeFileSync('output.gif', Buffer.from(writer.buffer.slice(0, writer.end())));
console.log('已生成 output.gif');7 个高频疑问
「转 GIF」下的其他工具