SKILL.md
readonly只读
name
video-to-gif
description
将视频转换为多个具有不同质量/大小权衡的GIF变体。生成一组对比结果,让用户直观地选出最佳效果。
技能:视频转GIF
将视频文件转换为多个不同参数的GIF变体,让用户直观比较并选出最佳效果。
前提条件:必须安装 FFmpeg 和 uv。gifsicle 可选(启用有损压缩变体)。
使用场景
用户想从视频片段创建GIF,但不确定合适的参数。GIF质量需要在以下方面权衡:
- 文件大小——越小越便于分享/嵌入
- 色彩准确度——颜色越少文件越小,但可能导致色带
- 流畅度——FPS越高越流畅,但文件越大
- 分辨率——宽度越大细节越清晰,但文件越大
与其猜测,不如用此技能生成多个变体,让用户决定。
默认工作流程
当用户提供视频文件时:
uv run --python 3.12 /path/to/skills/video-to-gif/scripts/video_to_gif.py <input.mp4>
这将在 <input>_gifs/ 目录下生成使用 full 预设(18个变体)的GIF:
- 3种FPS选项:10、15、20
- 3种宽度:480px、640px、800px
- 2种颜色数:128、256
输出包含一个排序对比表格,显示每个变体的文件大小、FPS、宽度和颜色数。
预设
| 预设 | 变体数 | 最佳用途 |
|---|---|---|
full |
~18 | 通用——广泛探索参数空间 |
minimal |
~4 | 快速对比——仅几个关键权衡点 |
lossy |
~12 | 最小文件——包含gifsicle有损压缩级别 |
quality |
~12 | 最佳画质——更高分辨率,包含拜耳抖动 |
# 快速对比,变体较少
uv run --python 3.12 .../video_to_gif.py input.mp4 --presets minimal
# 包含有损压缩(需要gifsicle)
uv run --python 3.12 .../video_to_gif.py input.mp4 --presets lossy
# 注重高质量
uv run --python 3.12 .../video_to_gif.py input.mp4 --presets quality
常用选项
| 标志 | 默认值 | 描述 |
|---|---|---|
-o, --output-dir |
<input>_gifs/ |
所有GIF变体的输出目录 |
--start |
无 | 开始时间(秒),用于裁剪源视频 |
--end |
无 | 结束时间(秒),用于裁剪源视频 |
--presets |
full |
预设配置:full, minimal, lossy, quality |
--fps |
预设 | 覆盖FPS值(例如 --fps 10 15 20) |
--width |
预设 | 覆盖宽度值(例如 --width 480 640) |
--colors |
预设 | 覆盖颜色数(例如 --colors 128 256) |
--lossy |
预设 | Gifsicle有损级别(例如 --lossy 0 30 80) |
示例
# 转换视频前10秒
uv run --python 3.12 .../video_to_gif.py demo.mp4 --end 10
# 提取特定片段
uv run --python 3.12 .../video_to_gif.py demo.mp4 --start 5 --end 15
# 自定义参数扫描
uv run --python 3.12 .../video_to_gif.py demo.mp4 --fps 12 15 --width 480 800 --colors 256
# 有损压缩对比(需要gifsicle)
uv run --python 3.12 .../video_to_gif.py demo.mp4 --lossy 0 30 60 100
如何选择
运行后,打开输出目录并比较:
- 从最小的文件开始——检查质量是否可接受
- 检查色带——如果可见,尝试256色或拜耳抖动(quality预设)
- 检查流畅度——如果太卡顿,提高到15或20 FPS
- 检查清晰度——如果文字难以辨认,提高到640或800px宽度
大多数屏幕录制的最佳平衡点通常是 640px、15fps、256色。
重要说明
- 宽度大于源视频分辨率的会自动跳过。
- 脚本使用FFmpeg的双通道调色板生成以获得最佳GIF质量(远优于单通道)。
- 通过gifsicle进行有损压缩可在30-60级别下将文件大小减少30-70%,视觉影响很小。
- 对于非常长的片段,建议先用
--start/--end裁剪——超过10秒的GIF会变得非常大。






