claude-watch 核心原理揭秘:ffmpeg 场景切换帧提取如何让 Token 成本保持平坦 【免费下载链接】claude-watchGive Claude the ability to watch any video — scene-change frames transcript a structured report, with a 0-10s hook microscope and optional Obsidian auto-save.项目地址https://gitcode.com/gh_mirrors/cla/claude-watch点击查看免费下载claude-watch是一个让 Claude 拥有看视频能力的开源技能贴上视频链接或本地文件路径Claude 会下载视频、抽取帧、获取带时间戳的字幕然后像真人一样看完并回答你的问题。它的成本控制核心正是ffmpeg 场景切换帧提取——帧数由镜头剪辑数决定而不是视频时长从而让长视频的Token 成本保持平坦。本文拆解这套设计的完整原理与关键代码路径。一句话总结普通做法是每隔 N 秒抽一帧claude-watch 改成每个镜头切换处抽一帧再用 100 帧硬顶 512px 宽度锁死成本上限——时长翻倍账单不翻倍。一、为什么帧是 Token 成本的大头先理解成本模型。Claude 通过Read工具逐帧读取 JPEG 图片图片 token 随帧数线性增长而字幕文本相当便宜10 分钟视频通常只有几千 token。整条管线如下视频 URL / 本地文件 │ yt-dlp 下载或本地直接探测 ▼ ffmpeg 场景切换检测selectgt(scene,0.3) │ 每个镜头边界取 1 帧≤100 帧硬顶 ▼ 字幕优先平台原生字幕 → 无字幕时 Whisper API 兜底 ▼ Claude 逐帧 Read → 基于画面语音回答 → 结构化 report.md决定成本的因素只有几个成本因子对 Token 的影响控制参数帧数线性增长最大头80 帧 512px ≈ 5-8 万图片 token--max-frames帧宽512px → 1024px 每帧约 4 倍 token--resolution字幕文本10 分钟视频仅几千 token可忽略无需操心所以控制帧数就是控制成本这正是场景切换提取要解决的问题旧式均匀采样的帧数与时长成正比——30 分钟视频按上限抽 100 帧意味着平均每 18 秒才有一帧信息稀疏且大量帧内容高度重复token 全花在了冗余画面上。二、场景切换帧提取一条滤镜表达式背后的原理核心思想很直白视频的信息量集中在镜头边界。一个镜头连续 5 秒画面几乎不变这 5 秒里抽 5 帧就是浪费 5 帧的钱。于是 claude-watch 改为——每个被检测到的镜头shot切换处只取一帧。实现全部交给 ffmpeg 的一个滤镜表达式位于 scripts/frames.py#L219-L220selecteq(n\,0)gt(scene\,0.3)拆开看只有两个条件gt(scene\,0.3)ffmpeg 会为每一帧计算一个scene场景分数0-1 之间表示与上一帧的画面差异。超过 0.3 视为镜头切换——这是一个宽松阈值能抓住硬切和大部分叠化转场却不会因普通运动、字幕滚动而误触发。eq(n\,0)强制保留第一帧。场景滤镜只在变化时触发不加这条会漏掉开场第一个镜头。完整提取命令还包含几个关键参数见 scripts/frames.py#L223-L237参数作用-vsync vfr可变帧率输出——滤镜选中哪帧就输出哪帧帧间距不再均匀-frames:v 100帧数硬顶无论检测到多少个切换最多产出 100 帧scale512:-2宽度缩到 512px高度按比例自动取偶数压缩单帧 token-q:v 4JPEG 质量档位兼顾清晰度与体积还有一个容易被忽略的细节-vf里串联了metadatamodeprint滤镜把每帧被选中时的精确时间戳pts_time打印出来scripts/frames.py#L243-L259 会解析它——所以每帧附带的是真实的时间点如t02:17而不是按帧序号均匀估算的。这让帧能与字幕逐词对齐。三、Token 成本保持平坦的 3 层机制把上面的设计拼起来成本平坦来自三层保护上限平坦入口 scripts/watch.py#L71 强制max_frames min(参数, 100)CLI 默认 80。视频再长图片 token 也超不过这 100 帧的天花板成本可预期。有效帧数平坦帧数 min(镜头切换数, 上限)。一段 30 分钟长视频若只有 60 个剪辑就只花 60 帧的钱而均匀采样的 100 帧摊到 30 分钟里每帧的信息量反而更低。项目 README 的原话是帧数受剪辑数约束而非时长the frame count is bounded by the number of cuts, not the duration。密度平坦每一帧都是镜头边界这个高信息帧token 全部花在独特内容上没有镜头内部重复帧的浪费。直观对比一下两种采样策略场景均匀采样每 N 秒一帧场景切换提取10 分钟 vlog100 帧封顶每 6 秒一帧按剪辑数约 40-80 帧全是镜头边界30 分钟长视频100 帧封顶每 18 秒一帧信息稀疏帧数受剪辑数约束通常远低于上限慢节奏口播 / 录屏100 帧大量重复画面切换过少 → 自动回退均匀采样见下节四、静态视频兜底均匀采样回退策略场景提取有一个天然盲区固定机位的录屏、长口播几乎没有切换。如果场景帧检测出来的数量少于 10 帧uniform_fallback_min10脚本会删掉这些场景帧改走按时长预算的均匀采样scripts/frames.py#L263-L277。设计哲学写在源码注释里稀疏的帧好过几乎没有帧sparse frames almost no frames。均匀采样的时长感知预算在 scripts/frames.py#L94-L110以 100 帧上限为例视频时长目标帧数密度≤30 秒约 12-30 帧≈1 fps密集30 秒 - 1 分钟约 40 帧密集1 - 3 分钟约 60 帧舒适3 - 10 分钟约 80 帧偏疏但可用10 分钟100 帧封顶稀疏扫描建议聚焦重跑当你用--start/--end指定时间窗聚焦模式时scripts/watch.py#L119-L146 会切换回均匀采样但预算由 auto_fps_focus 给出更密的档位短窗口可达 2 fps 上限——放大看细节的场景值得更密的帧。五、一鱼两吃同一份场景时间戳驱动的 3 个功能场景切换提取不只是省 token产出的镜头时间戳序列还被复用到了三处剪辑节奏指标scripts/pacing.py 消费场景时间戳计算镜头数、每分钟剪辑数cuts/min、平均/中位镜头时长——让 Claude 能像剪辑师一样量化分析这条视频的节奏为什么抓人。️Hero 帧挑选select_hero_frames 从场景帧中按确定性启发式挑 3-5 张主图hook 窗口内首帧、运动最强的镜头、最长持续镜头用于嵌入 Obsidian 维基页面。0-10 秒 Hook 显微镜scripts/hook.py 对开头 10 秒单独以 2 fps 密集重采再叠加词级 Whisper 时间戳让报告能逐词对齐这句话响起时画面里是什么——所有视频要么在前 10 秒抓住你要么失去你。最后由 scripts/report.py 生成结构固定的report.md叙事段落留成!-- pending Claude fill: ... --标记Claude 照着清单逐项填充。六、上手指南3 步让 Claude 看懂视频第 1 步 · 安装Claude Code/plugin marketplace add taoufik123-collab/claude-watch /plugin install watchclaude-watch首次运行时 scripts/setup.py 会自动预检macOS 上经 Homebrew 自动安装ffmpeg和yt-dlpLinux 则打印精确的apt/dnf/pipx命令字幕覆盖大多数公开视频且免费只有无字幕视频才需要配置 Whisper API key。第 2 步 · 调用/watch https://youtu.be/xxxx what hook did they open with?第 3 步 · 控制成本全部对应本文原理默认别动--resolution512px只有需要读屏上文字幻灯片、终端、代码时再升到 1024——单帧 token 约 4 倍。长视频问具体片段 → 用--start 2:15 --end 2:45聚焦模式帧预算更密且总量更少。--max-frames 40可收紧预算。注意手动指定--fps会禁用场景切换采样回退均匀采样--no-scene-change同理调试时用。七、核心文件路径速查模块职责scripts/watch.py入口编排下载 → 抽帧 → 字幕采样模式判定在 scripts/watch.py#L119-L146scripts/frames.py场景切换提取 extract_scene_change 帧预算逻辑scripts/hook.py0-10s hook 显微镜2 fps 词级转录scripts/pacing.py剪辑节奏指标cuts/min、镜头时长分布scripts/report.py结构化 report.md 生成器SKILL.md技能契约完整工作流程与 token 效率说明scripts/tests/test_frames_scene.py场景检测测试用 ffmpeg 合成三段变色视频验证边界检测与静态回退小结 Token 成本由帧数主导控制帧数就是控制账单。selecteq(n\,0)gt(scene\,0.3)让 ffmpeg 在每个镜头边界取一帧——帧数受剪辑数约束而非时长成本曲线因此平坦。 100 帧硬顶 512px 宽度成本上限始终可预期。 切换过少的静态视频录屏、口播自动回退均匀采样保证最低信息密度。 同一份场景时间戳顺带驱动剪辑节奏指标、Hero 帧挑选与 0-10s hook 显微镜一份计算、多处复用。赞分享【免费下载链接】claude-watchGive Claude the ability to watch any video — scene-change frames transcript a structured report, with a 0-10s hook microscope and optional Obsidian auto-save.项目地址https://gitcode.com/gh_mirrors/cla/claude-watch点击查看免费下载相关推荐如何设置CAN总线波特率MCP_CAN_lib的完整配置指南 如何设置CAN总线波特率MCP_CAN_lib的完整配置指南 在CAN总线通信项目中正确设置波特率是确保设备间稳定通信的关键第一步。MCP_CAN_l解锁Rime输入法的无限可能从新手到专家的进阶指南解锁Rime输入法的无限可能从新手到专家的进阶指南 你是否厌倦了商业输入法的广告弹窗和隐私泄露风险是否渴望拥有一个完全掌控、高度个性化的输入体验Rime输文档教程知识库SillyTavern 完整使用指南4 步搭建属于你的多角色 AI 聊天室SillyTavern 完整使用指南4 步搭建属于你的多角色 AI 聊天室 SillyTavern 是一款开源、可完全本地运行的 LLM 前端官方定位是面人工智能AI 应用交互助手前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考