FFmpeg 是一个用于本地音频/视频检查与转换的 CLI 技能,通过 ffmpeg 和 ffprobe 实现,调用方式为 /ffmpeg。
用途与范围 该技能用于对磁盘上的媒体文件进行探测元数据、裁剪片段、转码容器/编解码器、拼接片段、提取音频、截取缩略图以及构建 GIF 预览。它明确不适用于 AI 图像或视频生成(应使用 draw-thing)、UI 或布局设计(应使用 design)、网络下载(应使用 yt-dlp)以及广播/流媒体管线。
主要能力与模式 技能提供多种模式,通过参数分发:
- Doctor:运行 PATH 检查,若 ffmpeg/ffprobe 缺失则停止。
- Probe:运行探测辅助脚本,汇总流信息和时长。
- Trim:探测后选择流复制或重编码方案,输出到新路径。
- Transcode:探测编解码器,应用 H.264/AAC 或复制方案。
- Concat:验证各片段探测结果,使用 concat 解复用器方案并输出新文件。
- Extract audio:探测音频流,选择 MP3/M4A/复制方案。
- Thumbnail:定位帧,将 JPG/PNG 写入新路径。
- GIF:使用调色板 GIF 方案,并限制时长。
- Auto:根据自然语言编辑意图自动分类为 trim/transcode/thumbnail/gif。
- Help:显示模式、关键规则、脚本命令和参考索引。
使用方式 调用时使用 /ffmpeg 后接参数。例如:
- /ffmpeg doctor
- /ffmpeg probe ~/Movies/clip.mp4
- /ffmpeg trim ~/Movies/clip.mp4 00:00:05 00:00:15
- /ffmpeg transcode ~/Movies/clip.mov
- /ffmpeg concat part1.mp4 part2.mp4
- /ffmpeg extract-audio ~/Movies/clip.mp4
- /ffmpeg thumbnail ~/Movies/clip.mp4 00:00:03
- /ffmpeg gif ~/Movies/clip.mp4 00:00:02 4
关键规则
- 修改前必须探测:对每个源文件运行 probe_media.py,再选择映射、编解码器和时长边界。
- 默认不覆盖原文件:始终写入新输出路径;原地替换需用户明确批准并备份/临时文件替换。
- 仅使用预定义方案:ffmpeg 命令仅从 references/recipes-trim-transcode.md 和 references/recipes-thumbnail-gif.md 构建,不即兴创建滤镜链或破坏性批处理。
前置协议 在任何修改前运行:uv run python scripts/doctor.py --format json。若 JSON ok 为 false 则停止。安装指引:brew install ffmpeg。对每个输入文件运行:uv run python scripts/probe_media.py /absolute/path/to/input.mp4,解析 summary.duration_seconds、summary.stream_counts 和编解码器字段后再选择方案。
各模式协议
- Doctor:运行 doctor.py,报告检查状态和修复建议;若 ffmpeg-binary 或 ffprobe-binary 失败,不运行 ffmpeg 修改。
- Probe:要求可读本地文件路径,运行 probe_media.py,汇总容器、时长、视频/音频编解码器、分辨率、流数量;解释旋转、多轨音频或字幕流时加载 references/probe-fields.md。
- Trim:探测源,验证起止时间在时长内;关键帧对齐可接受时优先流复制,否则使用重编码裁剪方案;输出到 basename.trim.ext 或用户提供的新路径;加载 references/recipes-trim-transcode.md。
- Transcode:探测源,决定复制还是 H.264/AAC 重编码;多轨时显式映射流;除非用户禁止,MP4 网络分发包含 -movflags +faststart;加载 references/recipes-trim-transcode.md。
- Concat:探测每个片段,确认编解码器/分辨率兼容以进行复制拼接;用绝对路径构建 concat 列表文件;不警告不得用复制拼接不相关编解码器;输出到新 *.concat.mp4 路径;加载 references/recipes-trim-transcode.md。
- Extract audio:探测源,当 stream_counts.audio 为零时优雅失败;根据目标格式选择 MP3、M4A 或复制方案;写入 basename.audio.ext 新文件;加载 references/recipes-trim-transcode.md。
- Thumbnail:探测源,要求至少一个视频流;选择时间戳(用户值或 10% 时长限制在 1–10 秒);将 JPG/PNG 写入 OUTPUT/ 或同级路径,绝不覆盖源;加载 references/recipes-thumbnail-gif.md。
- GIF:探测源,限制时长(默认最大 5 秒,除非用户扩展);使用两遍调色板方案保证质量,单遍仅用于快速预览;写入 clip.gif 和可选 palette.png 新文件;加载 references/recipes-thumbnail-gif.md。
- Help(空参数):显示分发表、关键规则、doctor/probe 命令、参考索引和下方画廊。
自动检测启发式
- 安装/工具疑问 → Doctor。
- “metadata”、“codec”、“duration”、“how long”、“what format” → Probe。
- “cut”、“clip”、“from ... to ...”、时间范围 → Trim。
- “mp4”、“webm”、“h264”、“aac”、“smaller”、“compress” → Transcode。
- “join”、“merge clips”、“append videos” → Concat。
- “mp3”、“wav”、“m4a”、“strip video”、“audio only” → Extract audio。
- “poster frame”、“screenshot”、“still”、“thumbnail” → Thumbnail。
- “gif”、“animated preview” → GIF。
- 生成式图像/视频语言 → 拒绝;重定向到 draw-thing。
- UI/页面/布局设计 → 拒绝;重定向到 design。
- 模糊 → 询问模式并说明复制与重编码的权衡。
技能感知与重定向
- “generate an image”、“txt2img”、“AI video”、本地 Draw Things → draw-thing。
- “design a landing page”、“Figma”、“React layout” → design。
- “download from YouTube/URL” → yt-dlp。
- 直播、RTMP、OBS 接线 → 超出范围,建议流媒体文档。
参考文件与脚本 参考文件:references/safety.md(任何修改;原地覆盖问题)、references/probe-fields.md(解释探测 JSON)、references/recipes-trim-transcode.md(trim、transcode、concat、extract-audio)、references/recipes-thumbnail-gif.md(thumbnail、gif)。 脚本:scripts/doctor.py(验证 PATH 上的 ffmpeg/ffprobe,--format json)、scripts/probe_media.py(ffprobe 包装器,带摘要,--raw 获取完整负载)、scripts/check.py(验证 SKILL.md、评估、包干运行、审计)。验证命令:uv run python scripts/check.py。
报告模板 任何修改后报告:Doctor 状态(若本次会话运行)、探测摘要(时长、编解码器、流)、方案名称(复制 vs 重编码)、执行的确切 ffmpeg 命令、输出路径和大小变化、注意事项(关键帧裁剪、缺失音频、GIF 时长上限)。
适用场景与限制 适用于本地媒体文件的检查与转换,如裁剪、转码、拼接、提取音频、生成缩略图和 GIF。限制包括:不用于 AI 生成、设计、网络下载或流媒体;默认不覆盖原文件;仅使用预定义方案;需要 ffmpeg/ffprobe 在 PATH 中。