关于 video-to-gif
video-to-gif 可将 MP4、MOV 或 WebM 视频转换为适合常见发布渠道的 GIF。它使用 FFmpeg 调色板流程和按渠道设置的预设,在画质与文件大小间取舍。
主要功能
- 01按发布渠道设置尺寸和帧率
- 02使用 FFmpeg 两遍调色板渲染
- 03通过 ffprobe 检查源视频
- 04核对输出大小和尺寸
- 05支持转换前裁剪
适用场景
- 01为 Slack 讨论串制作循环片段
- 02在 GitHub README 中嵌入动画
- 03为邮件或社交卡片制作 GIF
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cognyai/ claude-code-marketing-skills --skill video-to-gif安装后在 Claude Code 中输入/video-to-gif确认已加载。
详细介绍
视频转 GIF
将视频(MP4、MOV、WebM)转换为 GIF,让文件确实够小,并且在你发布的平台上确实好看。适合搭配 /tiktok-launch-video、/reddit-launch-video 和 /linkedin-launch-video,用于在不支持 MP4 的地方分享渲染内容(Slack 讨论串、X 卡片、GitHub README、事务性邮件)。
GIF 是糟糕的视频格式,但它无处不在,因此我们使用 FFmpeg 的双遍 palettegen / paletteuse 流程,在格式允许的范围内尽可能提升画质。
用法
/video-to-gif launch.mp4 — 交互式操作,会询问目标平台
/video-to-gif launch.mp4 slack — 针对 Slack 调优
/video-to-gif launch.mp4 reddit — 针对 Reddit 评论调优
/video-to-gif launch.mp4 github — 针对 GitHub README 调优
/video-to-gif launch.mp4 twitter — 针对 X / Twitter 调优
/video-to-gif launch.mp4 email — 针对事务性邮件 / 新闻邮件调优
前置条件
ffmpeg -version | head -1 # must exist
ffprobe -version | head -1
如果尚未安装 FFmpeg:
# macOS
brew install ffmpeg
# Debian/Ubuntu
sudo apt install ffmpeg
步骤
1. 检查源视频
运行 ffprobe 获取源视频的时长、尺寸和帧率。需要这些信息来选择合适的预设,并在输出内容不符合要求时提前警告用户。
ffprobe -v error -show_entries stream=width,height,r_frame_rate -show_entries format=duration -of default=noprint_wrappers=1 <input>
记录:源视频宽度、源视频高度、源视频时长(秒)、源视频 fps。
2. 选择预设
如果用户指定了目标平台,则使用对应的预设;否则请先询问。每个预设都针对平台的实际尺寸限制和审美习惯进行了调优:
| 预设 | 宽度 | FPS | 循环 | 说明 |
|---|---|---|---|---|
| slack | 480 | 12 | 是 | 上传上限为 50MB;讨论串滚动很快;可读性优先于流畅度 |
| 480 | 15 | 是 | GIF 上限为 15MB;超过上限会自动转换为 MP4,导致无法循环播放 | |
| 600 | 15 | 是 | 上限为 100MB,但超过 20MB 后图片托管侧栏会失效 | |
| github | 720 | 15 | 是 | README 上限为 10MB;超过上限时 GitHub 会静默丢弃文件 |
| 480 | 10 | 是 | Gmail 附件大小达到 5MB 时会截断;许多 ESP 会在超过 1MB 时移除动画 | |
| web | 800 | 18 | 是 | 适用于落地页和产品博客的通用备用选项 |
经验法则:
- 如果源视频短于 6 秒,通常可以将 fps 提高约 3,而不会超出大小预算。
- 如果源视频长于 12 秒,将 fps 降低 2–3,并考虑剪辑。
- 切勿放大;如果源视频宽度小于预设宽度,则保留源视频宽度。
- 移除音频(GIF 无法承载音频),既能省去一个步骤,也能去除屏幕录制中意外录入的噪声。
3. 双遍调色板渲染(这是唯一正确的方法)
单遍 GIF 渲染会生成色带、抖动严重且体积过大的垃圾文件。正确方法是分两遍处理:
- 从源视频生成最佳的 256 色调色板。
- 使用 Floyd-Steinberg 抖动应用该调色板。
处理流程使用 FFmpeg 的 palettegen 滤镜,并将结果传给 paletteuse。使用滤镜分流,在单条命令中完成:
ffmpeg -y -i "<input>" \
-vf "fps=<FPS>,scale=<WIDTH>:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=floyd_steinberg" \
-loop 0 \
"<output.gif>"
滤镜链说明:
- 先使用
fps=<FPS>,确保调色板根据最终保留的实际帧生成。 scale=<WIDTH>:-1保持宽高比;-1会将高度四舍五入。对于要求偶数尺寸的编码器,使用-2(GIF 不需要,但这样做无妨)。flags=lanczos是通用效果最好的缩小算法。stats_mode=diff在选择调色板颜色时会提高运动区域的权重,使文字更锐利、界面更清晰、色带更少。dither=floyd_steinberg是最佳默认选项。对于没有渐变的界面或锐利边缘,可以改试dither=bayer:bayer_scale=3,文件会稍大一些,但纯色区域不会出现抖动噪点。-loop 0= 无限循环。使用-loop 1可仅播放一次。(在 Slack 和 Twitter 上,用户通常预期无限循环。)
4. 渲染并验证
运行命令,然后进行验证:
# Check the file size
ls -lh "<output.gif>"
# Check the GIF's actual dimensions and frame count
ffprobe -v error -count_frames -select_streams v:0 \
-show_entries stream=width,height,nb_read_frames \
-of default=noprint_wrappers=1 "<output.gif>"
如果文件大于对应平台的大小上限(见上表),请只执行以下一项:
- 将 FPS 降低 2–3 后重新渲染(最能保留画质)。
- 将宽度降低约 80px 后重新渲染(文字可能会更难辨认)。
- 先剪辑源视频(
-ss <start> -t <duration>),然后重新渲染。
不要同时采用这三种方法;每次只调整一个变量,这样才能知道哪项调整起了作用。
5.(可选)转换前剪辑
如果源文件较长,请在调色板处理前先剪辑 *,这样调色板会更准确,文件也更小。
# Take 8 seconds starting at 2.5s in
ffmpeg -y -ss 2.5 -t 8 -i "<input>" -c copy "<input>.trimmed.mp4"
# then run the two-pass palette command on .trimmed.mp4
-ss 放在 -i 之前 可快速按关键帧定位,但精度稍差。若要逐帧精确剪辑,请将 -ss 放在 -i 之后(速度较慢)。
6. 交付文件
输出以下信息:
- 输出 GIF 的路径
- 磁盘上的最终文件大小
- 最终尺寸和帧数
- 文件大小限制状态:"符合 Slack(50MB)✓" / "超出 GitHub README 限制(10MB),请使用 fps=12 重试 ✗"
单行命令(适用于知道自己想要什么的用户)
# Slack-tuned (480px / 12fps)
ffmpeg -y -i in.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=floyd_steinberg" -loop 0 out.gif
# Twitter-tuned (480px / 15fps)
ffmpeg -y -i in.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=floyd_steinberg" -loop 0 out.gif
# GitHub README-tuned (720px / 15fps)
ffmpeg -y -i in.mp4 -vf "fps=15,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=floyd_steinberg" -loop 0 out.gif
# Email-tuned (480px / 10fps, single loop)
ffmpeg -y -i in.mp4 -vf "fps=10,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=floyd_steinberg" -loop 0 out.gif
常见错误
- 单次渲染 GIF —
ffmpeg -i in.mp4 out.gif会生成难看且体积过大的输出。请始终使用调色板处理流程。 - 放大 — 切勿放大 GIF;效果只会从“差”变成“糟糕透顶”。只需保持原尺寸或缩小。
- 人像对话内容使用高 FPS — 超过 18fps 对 GIF 来说毫无意义;请降至 12–15fps,并将节省的字节用于提高分辨率。
- 包含音频 — GIF 无法承载音频。如果需要音频,该平台支持 MP4,应改为提供 MP4。
- 较长的 GIF(> 15s) — 如果需要 30 秒以上,可能应该使用 MP4 或 WebP,而不是 GIF。请询问用户是否可以使用其他格式。
- 通过邮件发送 40MB 的 GIF — 大多数 ESP 会在动画超过 1MB 时移除动画,收件人只能看到静态的第一帧。请使用邮件预设,或改用带链接的静态 PNG 主图。
相关内容
/tiktok-launch-video、/reddit-launch-video、/linkedin-launch-video— 生成此技能要转换的源 MP4/welcome-series、/winback-engine— 在这些位置嵌入小 GIF 可以提升互动率