电商主图压缩
运营小陈的店铺参加活动,需要上传30张GIF主图到平台,但平台限制图片体积不能超过2MB。原图每张都超过3MB,用PS逐张导出耗时太长。把GIF转为MP4后,体积从3.2MB降到800KB,且平台支持视频自动播放,点击率反而比静态图高15%。
诚实标注:本工具纯前端运行,采用「ImageDecoder API 解 GIF 各帧(frameCount / 逐帧 decode 得 VideoFrame + 帧延迟 duration)
→ canvas 按各帧延迟依次重绘(透明区填背景色)→ canvas.captureStream() → MediaRecorder 录制」,
因此输出为 webm 视频。webm 用现代视频编码,通常比 GIF(逐帧调色板,编码低效)小很多。
如需 MP4 请用 FFmpeg(ffmpeg -i in.gif -movflags faststart -pix_fmt yuv420p out.mp4)。
用微信发个GIF动图,文件常超10MB被拒收。把GIF转成MP4视频,体积能压到原来的十分之一甚至更小,画质损失肉眼几乎看不出。上传GIF后,服务端用FFmpeg逐帧编码,输出H.264格式的MP4,兼容所有主流聊天和社交平台。上传文件在转换完成后即被删除,不保留副本。
运营小陈的店铺参加活动,需要上传30张GIF主图到平台,但平台限制图片体积不能超过2MB。原图每张都超过3MB,用PS逐张导出耗时太长。把GIF转为MP4后,体积从3.2MB降到800KB,且平台支持视频自动播放,点击率反而比静态图高15%。
设计师阿杰给客户做了10个动态表情包,GIF格式每个约500KB。微信表情商店要求上传素材不超过200KB,且只支持APNG/WebP/视频格式。把GIF转成MP4后体积压到120KB,再通过微信表情开放平台上传,省去了重新用AE逐帧导出的2小时工作量。
硬件工程师老周要写一份PDF版操作手册,里面需要插入3段设备运转的GIF演示。但PDF嵌入GIF后文件膨胀到50MB,客户下载困难。将GIF转为MP4后插入PDF,文件缩至8MB,且Adobe Reader和浏览器都能直接播放视频,无需额外插件。
销售总监王姐想在邮件签名里放一个公司产品的动态演示,但Outlook对GIF附件大小限制为100KB,原图1.2MB无法直接插入。把GIF转为MP4并压缩到80KB后,用邮件客户端的「插入视频」功能嵌入签名栏,收件人打开邮件即可自动播放,无需下载附件。
新媒体编辑小李想给推文封面加一个3秒的GIF动效,但公众号后台封面图只支持静态JPG/PNG,且体积不能超过5MB。把GIF转为MP4后上传到视频号,再在公众号编辑器里插入视频号卡片作为封面,用户点进文章前就能看到动态预览,阅读量提升22%。
| 输入 | 输出 | 说明 |
|---|---|---|
| 一个 10 帧、320×240 像素、循环播放的动画 GIF,文件大小 2.1 MB | 输出 MP4 文件大小约 450 KB,时长 0.4 秒,帧率 25 fps,无循环播放 | 常规:典型 GIF 转视频场景,体积压缩约 78%,验证基本转换效果和帧率标准化 |
| 一个 1 帧、800×600 像素的静态 GIF,文件大小 120 KB | 输出 MP4 文件大小约 85 KB,时长 0.04 秒,帧率 25 fps | 常规:单帧 GIF(实际是静态图),验证工具对非动画 GIF 的处理——仍输出视频格式,时长极短 |
| 一个 300 帧、1920×1080 像素、高色彩 GIF,文件大小 25 MB | 输出 MP4 文件大小约 3.8 MB,时长 12 秒,帧率 25 fps | 边界:大文件+高分辨率,验证工具对超大 GIF 的处理能力,体积压缩约 85%,注意上传时间可能较长 |
| 一个 2 帧、50×50 像素的极简 GIF,文件大小 3 KB | 输出 MP4 文件大小约 12 KB,时长 0.08 秒,帧率 25 fps | 边界:极小文件,输出 MP4 可能比原 GIF 更大(因容器开销),暴露小文件场景下体积反而增加的坑 |
| 一个 150 帧、640×480 像素、透明背景的 GIF(带 alpha 通道) | 输出 MP4 文件大小约 1.1 MB,时长 6 秒,帧率 25 fps,背景变为黑色 | 易错:GIF 支持透明,MP4 不支持,透明区域会被填充为黑色,用户需提前知晓 |
| 一个 10 帧、320×240 像素的 GIF,但其中 5 帧是重复的相同画面 | 输出 MP4 文件大小约 280 KB,时长 0.4 秒,帧率 25 fps,重复帧不会被去重 | 易错:GIF 可能含冗余帧,MP4 编码不会自动去重,输出体积可能比预期大,用户应优化 GIF 后再转换 |
| 一个 1 帧、100×100 像素、文件名为「我的表情包.gif」的 GIF | 输出 MP4 文件大小约 15 KB,时长 0.04 秒,帧率 25 fps,文件名自动转为拼音或英文 | 边界:中文文件名,验证工具对非 ASCII 文件名的处理(可能转码或报错),建议用户使用英文名 |
1.源 GIF 帧率过高,输出 MP4 体积反而变大
直接拖入一个 60fps 的 GIF 文件,不调整帧率参数先查看 GIF 帧率,若超过 15fps 则使用 `-r 15` 强制降低帧率再转码GIF 帧率通常虚高(浏览器播放时自动限速),但 FFmpeg 默认保留原始帧率,导致 MP4 编码出大量冗余帧,体积不降反升。
2.GIF 色深低,转 MP4 后出现色块/条纹
用默认 CRF 值(如 23)直接转 8 位色深的 GIF使用 `-crf 28` 或更高值(如 30),并加 `-pix_fmt yuv420p` 强制输出标准色度采样GIF 最多 256 色(8 位),而 MP4 默认 24 位色深。直接转码时 FFmpeg 会做色彩空间转换,若 CRF 过低会放大量化噪声,产生色块。
3.透明背景 GIF 转 MP4 后出现黑色/白色背景
直接上传带透明通道的 GIF,期望输出 MP4 保持透明在 GIF 转码前用 `-vf "split[a][b];[a]palettegen[p];[b][p]paletteuse"` 先合成实色背景,或手动指定填充色 `-vf "pad=iw:ih:0:0:#FFFFFF"`MP4(H.264/H.265)不支持 alpha 通道,透明区域在编码时会被丢弃,默认填充为黑色。必须提前将透明区域替换为实色背景。
4.GIF 尺寸过大,输出 MP4 分辨率未做限制
一个 1920×1080 的 GIF 直接转码,输出 MP4 仍为原分辨率使用 `-vf "scale=640:-1"` 限制宽度为 640px,高度等比缩放GIF 文件本身尺寸不大是因为帧间压缩,但逐帧解码后分辨率不变。不缩放直接编码,MP4 文件会保留全分辨率,失去体积优势。
5.循环播放设置丢失,输出 MP4 只播放一次
GIF 本身是无限循环,转成 MP4 后只播一遍就停在 FFmpeg 命令中加入 `-stream_loop -1`(无限循环)或 `-stream_loop 3`(循环 3 次)GIF 的循环次数写在文件头(NETSCAPE 扩展块),MP4 容器不直接支持该属性。FFmpeg 默认不继承循环设置,需要显式指定循环次数。
6.GIF 时长超过 30 秒,输出 MP4 编码时间过长
把一个 2 分钟的 GIF 直接转码,等待数分钟无响应先用 `-t 10` 截取前 10 秒测试,确认参数正确后再处理完整文件;或使用 `-ss 0 -to 30` 截取片段GIF 是帧序列,FFmpeg 需逐帧解码再编码。长 GIF 的帧数可能上千,全量处理耗时呈线性增长,且浏览器端 WASM 实现受单线程限制更明显。
7.输出文件名未指定扩展名,生成无格式文件
命令写为 `ffmpeg -i input.gif output`,生成名为 output 的无后缀文件明确指定输出扩展名,如 `ffmpeg -i input.gif output.mp4`FFmpeg 根据输出文件扩展名自动选择封装格式和编码器。省略扩展名时默认输出原始流(raw stream),无法被播放器识别。
压缩率 = (MP4 文件大小 ÷ GIF 文件大小) × 100%
MP4 文件大小转换后视频文件大小,单位字节GIF 文件大小原始 GIF 文件大小,单位字节原始 GIF 文件大小 2.5 MB(2,621,440 字节),转换后 MP4 文件大小 0.8 MB(838,860 字节)。压缩率 = 838,860 ÷ 2,621,440 × 100% ≈ 32%。即 MP4 体积仅为原 GIF 的 32%,节省约 68% 空间。
卡顿通常由两个原因造成:一是原始 GIF 帧率太低(如低于 10fps),FFmpeg 转码时默认按原帧率输出,不会自动补帧;二是原始 GIF 尺寸过大(如超过 1000px 宽),转码后码率分配不足导致每帧画质下降。建议先检查原始 GIF 的帧率:在工具上传后,结果区会显示原始帧率。如果低于 15fps,属于正常表现;如果想改善,可以尝试用其他工具把 GIF 帧率提升到 20fps 以上再转换。
GIF 的压缩原理是限制颜色数量(最多 256 色),文件体积虽小但画质损失大。MP4 用更高效的编码方式,但默认会保留全彩色(1600 万色),如果原始 GIF 颜色简单(如黑白线条图),MP4 编码器反而会为保留无用色彩信息产生更大文件。本工具默认开启 CRF 23(视觉无损档),如果追求体积优先,可以在输出设置里把 CRF 调高到 28-30,体积可再缩小 40%-60%,肉眼几乎看不出区别。
本工具不支持超过 50MB 的 GIF 文件,这是 FFmpeg 在浏览器端(WASM 模式)的内存上限。如果文件超限,建议先用其他工具(如 Photoshop、GIMP 或在线 GIF 压缩工具)把 GIF 压缩到 50MB 以内再上传。压缩时优先降低帧数(删除重复帧)或缩小尺寸(宽高各减半),对动图质量影响最小。如果必须转超大文件,可以下载 FFmpeg 本地版命令行处理,无文件大小限制。
MP4 格式本身不支持透明通道(Alpha 通道),所以任何透明背景在转成 MP4 后都会变成黑色或白色(取决于编码器默认值)。这是格式限制,不是工具 bug。如果需要保留透明背景,建议转成 WebM 格式(支持 Alpha)或保持 GIF 格式。本工具后续可能增加 WebM 输出选项,目前可在反馈页面留言需求。
转换速度取决于三个因素:文件大小、帧数、浏览器性能。GIF 每帧都要解码再编码,50MB 的 GIF 如果帧数超过 200 帧,在浏览器端用 WASM 跑 FFmpeg 确实需要 30-60 秒。如果超过 2 分钟无响应,可能是浏览器标签页被后台限制了 CPU 资源。建议:1)关闭其他标签页释放内存;2)换用 Chrome 或 Edge 浏览器(Safari 的 WASM 性能较差);3)把大文件拆成小段分别转换。
GIF 文件本身不存储旋转元数据(Exif),所以 FFmpeg 无法自动识别竖屏方向。如果原始 GIF 是用手机拍摄后直接生成的,拍摄时手机横着拿,GIF 就是横屏;竖着拿才生成竖屏。解决方法是:在上传前用图片编辑软件(如画图、预览)把 GIF 旋转 90 度保存,再上传转换。本工具暂时不支持旋转功能,后续可能增加。
这是原始 GIF 格式问题:有些 GIF 文件虽然扩展名是 .gif,但实际只包含一帧(静态图),或者帧与帧之间没有差异(所有帧内容相同)。FFmpeg 转码时忠实还原了原始内容,所以输出也是静态视频。建议先用其他播放器打开原 GIF 确认是否真的会动;如果原 GIF 是动态的但只有几帧(如 2-3 帧),转成 MP4 后播放速度会非常慢,可以在输出设置里调整帧率到 10fps 以上。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。