
今天拆的是 ffmpeg-skill:把 ffmpeg 拆成 42 件带机器可读契约的小工具,交给编码 Agent 做剪辑与平台交付;文章给全它在链条上的位置、四步上手路、十八处实测卡点,以及 0 美元许可背后真正的开销。
verified: true。
probe.py、cut.py、fit.py、export.py 照常处理3。反方向不存在:它不调用这两个,也不调用任何模型。--dry-run 只打印命令、--json 回结构化结果、--plan FILE 把干跑写成带输入指纹的计划、--overwrite 是覆盖旧文件的唯一授权。contract --json 输出 contract_version 1.0 和 42 件工具,每件给出 input_schema、output_schema、role、capabilities、verification、mutates_input。我数过,工具列表正好 42 条。input_schema 由代码生成,不由人另写一份。打印契约的那一刻,脚本自己的 argparse 解析器被拦下来,flags、类型、枚举、默认值、互斥组全部照搬4。加一个 flag,契约和 MCP 的定义同时跟上,没有第二处要改。
contract_version 与 skill.version 的版本表;GitHub 标 937 行、87.9 KB。docs/contract.mdtests/test_contract.py 每次 CI 都拿这四个数字,和 scripts/ 下的实际文件数比对。契约文档自己记了一笔:SKILL.md 里那句「28 个脚本」,曾静悄悄地过期了十二次工具新增。tools/list 从契约翻译,默认只列 12 件核心工具,其余 30 件按名字仍可 tools/call,FFMPEG_SKILL_MCP_FULL=1 才全列。我用 --list 数过,默认那 12 件是 audio、caption、check、cut、export、fit、graphics、look、loudness、probe、render、silence。doctor 读 ffmpeg -filters、-encoders、-bsfs,把契约里声明的每一项折成三种状态:available、missing、unknown。unknown 不许写成 missing——列不出来不等于没装。-filters 的列宽改短,0.9.0 的解析器按旧宽度对齐,一行都没匹配上,于是把「没解析到」报成了「全都没装」3。现在认的是 io 标记(A->A、|->V),列宽和分隔符都不影响判断。requires_visual_verification,画面变了就得跑 look.py 出联络表。SKILL.md 第 8 步要求报告里写下 Look: 和小图路径;没有视觉能力的调用方要如实写「未检查」。
references/ 下另有 scripts.md 124,773 字节、gotchas.md 23,012 字节、ci-platform-pitfalls.md 13,931 字节,契约文档 90,014 字节,按需再读。render.py 顺序执行。status、output、commands、probe、verified,加上工具自己的字段,例如 cut.py 的 precision。--plan 写下的 argv、命令行和输入指纹(文件大小,加首尾各 8 MiB 的 sha256),render.py 执行前逐项比对。render.py --export-timeline 输出 FCPXML、EDL 或 OTIO,剪切点、速度、叠化、配乐床和章节标记都带过去。check.py --platform X 逐行给 PASS、WARN、FAIL,FAIL 还带修法。npx ffmpeg-skill 给 Claude Code,--cursor、--codex、--all、--project 各管一个去处。我跑的是安装器本身:node bin/install.js --dir ./skills,它自己认出了 ffmpeg 7.1.5,把技能落到指定目录。_contract.py doctor 在这台机器上给的是:73 项能力可用、0 项必需缺失、2 项可选缺失(external:parakeet 与 external:whisper,本机转写引擎)、构建里编了 16 个 GPU 编码器。NotoSansCJK-Regular.ttc;hi、bn、ta、th 缺字体;彩色 emoji 装了,但 libass 在这版构建上只出黑白。contract --json 有 42 条,--static 是关掉环境探测的版本。接 MCP 的话,客户端默认看到 12 件工具,够用就先这样。python3 $S/render.py talk.mp4 --template tiktok --cues cues.txttemplates/tiktok.json 我打开看过,一条命令填的是这么一组东西:9:16 裁切;字幕 animate: pop 加逐词卡拉 OK,字号 24、边距 63;开头 0–3 秒压一张 hook 卡;logo 固定左上;响度 −14 LUFS、真峰 −1.0 dBTP;导出走 tiktok 预设并顺手归一;最后对写出的文件跑一次 check.py --platform tiktok5。probe.py、cut.py、fit.py、export.py,一步一件。
kind: missing_tool,或者在 ffmpeg 里直接失败。触发条件:机器上是精简构建,缺 libass、zscale 或 drawtext。doctor --json 的 tools 字段,每件工具有自己的 usable。brew install ffmpeg 装的是精简版ffmpeg 公式没有 subtitles、drawtext、zscale;ffmpeg-full 是 keg-only,装完也不进 PATH。ffmpeg-full。你能怎么办:doctor --json 看 ffmpeg_path 与 ffmpeg_source,确认它到底用了哪个二进制。doctor 汇总行写 ok,caption.py 依然报错。触发条件:macOS 精简版 ffmpeg。ok 只说明没有「所有工具都需要的」能力缺失。你能怎么办:读 doctor --json 里每件工具的 usable,别看总行。npx ffmpeg-skill 装完就再没跑过。claude plugin update 更新。verified: true。触发条件:输入是 MPEG-TS。fit.py --fit crop 默认取正中。crop=202:360,只留 31.6% 的宽度。你能怎么办:用 --crop-x、--crop-y 指定保留位置,或者用 --fit pad --pad-fill blur 补模糊边。kind: input;它选择拒绝,不去画一排方块。触发条件:机器上没有覆盖该语言的字体。doctor --json 的 fonts.scripts;只有汉字时加 --lang ja|ko 消歧。libass_color: false,报告里写 mode: mono。你能怎么办:给 --emoji-assets 一个按码位命名的 PNG 目录(1f389.png),技能自己从不下载。--timeout 是 1800 秒,整小时 1080p 全场重编码。--timeout 0 或给个更大的值,或者 --fast。render.py7。你能怎么办:把整条链写成 project.json,先 --dry-run 看全部命令。silence 之外某件工具的定义。触发条件:客户端按 tools/list 建菜单。FFMPEG_SKILL_MCP_FULL=1 才列出来。你能怎么办:按需开全量,或者让 Agent 用 tools/call 按名字调。filter_complex,没有入口。触发条件:非常规滤镜组合。silence.py 报零段静音。触发条件:底噪高于 −35 dBFS 的默认阈值。--list 看清单,再调 --threshold 和 --min-silence。python 或 py,或者等这条收掉再上 Windows。clip_fit.y4m。触发条件:输入是少见的容器。fit.py --dry-run 时就是这样,命令里同时挂了 -c:v libx264 和 -movflags +faststart。你能怎么办:显式写 -o,别依赖默认名。kind: input、reason: output_exists,一个字节都没生成。触发条件:-o 指向已经存在的文件。out/tight.wav 时被拒,返回里带这个文件的路径、大小与 mtime。你能怎么办:确认要替换就加 --overwrite,否则换一个输出名。--plan 写完之后输入被替换,哪怕只在文件尾追加一个字节。render.py fit.plan.json,返回「content changed since the plan was made」,审计日志里记着 expected 与 actual 的 sha256,大小从 103,681,858 变成 103,681,859。你能怎么办:重新 --plan 一次;把计划当快照,别当脚本挂进定时任务。
| 项 | 价格 | 说明 |
|---|---|---|
| 软件 | 0 美元 | MIT,商用可10 |
| 安装 | 0 美元 | npx ffmpeg-skill,Node 16 以上只给安装器用 |
| ffmpeg | 0 美元 | 要带 libass、drawtext、zscale、xfade 的构建 |
| 字体 | 0 美元 | 中日韩、emoji 要自己装或给 PNG 目录 |
| 机器时间 | 你的 CPU | 项目实测:10 分钟 1080p 的 YouTube 预设重编码 514 秒,--fast 162 秒3 |
| Agent 上下文 | 每次会话 29.3 KB | SKILL.md 主文件,长文另存 references/ |
| Agent 订阅 | Pro 每月 20 美元,年付 17(一次付 200) | Max 自每月 100 美元起,都含 Claude Code11 |
| 方案 | 你给它什么 | 它给你什么 | 它在这一层 | 许可与公开体量 |
|---|---|---|---|---|
| ffmpeg-skill | 素材、一句人话或 project.json | 成片、计划、合规表、联络表 | 原子操作层,42 件工具 | MIT,3.5k star1 |
| Remotion(第 23 期) | React 组件 | mp4 | 渲染底座,浏览器 | 自订两层许可,68.6k star12 |
| HyperFrames(第 14 期) | HTML | mp4 | 渲染底座,浏览器 | Apache-2.0,74.7k star13 |
| OpenMontage(第 22 期) | 产线描述、编码 Agent | 成片 | 编排层,12 条产线 | AGPL-3.0,72.7k star14 |
| Hypit(第 15 期) | SVML 工作流 | 成片、技能包 | 工作流描述语言 | 改过的 Apache-2.0,26.2k star15 |
| video-shotcraft(第 42 期) | 124 张镜头卡 | 1080p 宣传片 | 技能包,镜头库 | Apache-2.0,14.4k star16 |
| FilmCraft(第 43 期) | 素材、.fcproj、710 条命令 | mp4/ProRes、XML/OTIO | 剪辑器,自研编解码 | MIT 或 Apache-2.0,16.7k star17 |
| video-use(更早) | 素材夹、转写稿 | final.mp4 | 剪辑技能包,有主张 | MIT,30.0k star18 |
| OpenChatCut(第 16 期) | 对话 | 可继续改的时间线 | 桌面剪辑器 | AGPL-3.0,2.7k star19 |
probe.py 只是一份普通输入。github.com
npmjs.com
github.com
github.com
github.com
github.com
github.com
ffmpeg.org
github.com
claude.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.