mcpField
V
video-to-gif

video-to-gif

github.com/cognyai创意与媒体11148 次安装2 周前更新
代码仓库

关于 video-to-gif

video-to-gif 可将 MP4、MOV 或 WebM 视频转换为适合常见发布渠道的 GIF。它使用 FFmpeg 调色板流程和按渠道设置的预设,在画质与文件大小间取舍。

主要功能

  1. 01按发布渠道设置尺寸和帧率
  2. 02使用 FFmpeg 两遍调色板渲染
  3. 03通过 ffprobe 检查源视频
  4. 04核对输出大小和尺寸
  5. 05支持转换前裁剪

适用场景

  1. 01为 Slack 讨论串制作循环片段
  2. 02在 GitHub README 中嵌入动画
  3. 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循环说明
slack48012是上传上限为 50MB;讨论串滚动很快;可读性优先于流畅度
twitter48015是GIF 上限为 15MB;超过上限会自动转换为 MP4,导致无法循环播放
reddit60015是上限为 100MB,但超过 20MB 后图片托管侧栏会失效
github72015是README 上限为 10MB;超过上限时 GitHub 会静默丢弃文件
email48010是Gmail 附件大小达到 5MB 时会截断;许多 ESP 会在超过 1MB 时移除动画
web80018是适用于落地页和产品博客的通用备用选项

经验法则:

  • 如果源视频短于 6 秒,通常可以将 fps 提高约 3,而不会超出大小预算。
  • 如果源视频长于 12 秒,将 fps 降低 2–3,并考虑剪辑。
  • 切勿放大;如果源视频宽度小于预设宽度,则保留源视频宽度。
  • 移除音频(GIF 无法承载音频),既能省去一个步骤,也能去除屏幕录制中意外录入的噪声。
3. 双遍调色板渲染(这是唯一正确的方法)

单遍 GIF 渲染会生成色带、抖动严重且体积过大的垃圾文件。正确方法是分两遍处理:

  1. 从源视频生成最佳的 256 色调色板。
  2. 使用 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>"

如果文件大于对应平台的大小上限(见上表),请只执行以下一项:

  1. 将 FPS 降低 2–3 后重新渲染(最能保留画质)。
  2. 将宽度降低约 80px 后重新渲染(文字可能会更难辨认)。
  3. 先剪辑源视频(-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. 交付文件

输出以下信息:

  1. 输出 GIF 的路径
  2. 磁盘上的最终文件大小
  3. 最终尺寸和帧数
  4. 文件大小限制状态:"符合 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

常见错误

  1. 单次渲染 GIF — ffmpeg -i in.mp4 out.gif 会生成难看且体积过大的输出。请始终使用调色板处理流程。
  2. 放大 — 切勿放大 GIF;效果只会从“差”变成“糟糕透顶”。只需保持原尺寸或缩小。
  3. 人像对话内容使用高 FPS — 超过 18fps 对 GIF 来说毫无意义;请降至 12–15fps,并将节省的字节用于提高分辨率。
  4. 包含音频 — GIF 无法承载音频。如果需要音频,该平台支持 MP4,应改为提供 MP4。
  5. 较长的 GIF(> 15s) — 如果需要 30 秒以上,可能应该使用 MP4 或 WebP,而不是 GIF。请询问用户是否可以使用其他格式。
  6. 通过邮件发送 40MB 的 GIF — 大多数 ESP 会在动画超过 1MB 时移除动画,收件人只能看到静态的第一帧。请使用邮件预设,或改用带链接的静态 PNG 主图。

相关内容

  • /tiktok-launch-video、/reddit-launch-video、/linkedin-launch-video — 生成此技能要转换的源 MP4
  • /welcome-series、/winback-engine — 在这些位置嵌入小 GIF 可以提升互动率

评论

支持 Markdown