watch — Claude 完整观看视频
将视频拆分为 Claude 原生可读的内容:帧图像(通过 Read 工具查看)+ 转录(文本)。这样不仅能理解文字,还能理解屏幕上发生的一切。
双语。 这是英文版本。完整的俄语镜像为
SKILL.ru.md。 使用用户所用的任何语言工作;工作流程和命令完全相同。
依赖(通过 install.sh 一次性安装)
检查方法:command -v yt-dlp ffmpeg whisper node。
yt-dlp→~/.local/bin/yt-dlp(位于~/.local/python312下的 Python 3.12 中——系统 Python 通常太旧;最新的 yt-dlp 版本需要 3.10+);ffmpeg→ 来自imageio-ffmpeg,链接到~/.local/bin/ffmpeg;whisper→openai-whisper(在系统 Python 下;模型在首次使用时下载);node→~/.local/node(v24)—— 用于绕过 YouTube 的防御机制。
对于 YouTube 而言,install.sh 还会设置:
- 一个 PO-token 提供者(
bgutil),以脚本模式构建于~/.local/bgutil-pot/server/build/下; - 一个 Node.js 运行时 + 一个 EJS 组件,用于解决 YouTube 的 n-challenge;
- 来自已登录 YouTube 账户的 cookies,位于
~/.config/watch/cookies.txt。
如果 cookies 过期(YouTube 再次要求“确认您不是机器人”),请让用户使用浏览器扩展(如“Get cookies.txt LOCALLY”)重新导出 cookies.txt,并将其放置到 ~/.config/watch/cookies.txt。
始终通过包装脚本下载: bash ~/.claude/skills/watch/yt.sh … —— 它会自动添加正确的 YouTube 参数。对于直接 mp4/Loom/Zoom URL,额外参数无害。
工作流程
1. 准备工作
- 创建工作目录:
mkdir -p /tmp/watch/<slug>(slug = 来自 URL/主题的简短名称)。 - 解析 URL(YouTube / Loom / Zoom 分享链接 / 直接视频文件)。本地文件跳过下载步骤——直接处理。
2. 转录——优先获取字幕(免费,当有时)
bash ~/.claude/skills/watch/yt.sh --write-subs --write-auto-subs --sub-langs "en,ru" \
--skip-download --convert-subs srt -o "/tmp/watch/<slug>/subs.%(ext)s" "<URL>"
如果出现 .srt 文件,那就是带时间戳的现成转录——直接使用。
3. 下载视频(帧画面和 Whisper 回退都需要)
bash ~/.claude/skills/watch/yt.sh -f "bv*[height<=480]+ba/b[height<=480]/18/best" \
-o "/tmp/watch/<slug>/video.%(ext)s" "<URL>"
你会得到一个 .mp4 或 .webm 文件——从此使用实际文件名(video.*)。
如果没有字幕,使用 Whisper 转录音频(模型 small;base 用于快速测试):
whisper "/tmp/watch/<slug>/video.webm" --model small --language en \
--output_format srt --output_dir "/tmp/watch/<slug>/"
首次运行会下载模型(small 约 460 MB)—— 这是正常的,一次性操作。对于非英语音频,去掉 --language en 或设置正确的语言代码。Whisper 较慢:34 分钟的片段需要几分钟——建议后台运行。
4. 按场景变化抽取帧(关键步骤——非定时采样)
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "select='gt(scene,0.3)',showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
- 阈值
0.3—— 调整0.2–0.4以控制场景密度(阈值越低,帧数越多)。 - 从 showinfo 日志(
scenes.log)获取每帧的时间戳(pts_time)。 - 如果帧数过多(长视频),保留约 60–150 个最关键的帧,去除时间接近的帧。解码长视频需要一些时间——建议后台运行。
回退方案——如果场景太少(0–2 帧)。 平滑、未剪辑的素材(连续拍摄、无人机镜头、人物谈话)场景变化很少。此时改为固定间隔采样:
ffmpeg -i "/tmp/watch/<slug>/video.webm" -vf "fps=1/5,scale=960:-1,showinfo" \
-vsync vfr "/tmp/watch/<slug>/frames/frame_%04d.png" 2> "/tmp/watch/<slug>/scenes.log"
根据视频长度调整间隔(1/5 = 每 5 秒一帧),使帧数保持在约 150 帧左右。第 i 帧的时间戳 = i × 间隔。
4a. YouTube:为什么一切都通过 yt.sh
YouTube(2025 年及以后)同时需要以下三项,否则会返回 HTTP 403 / “不是机器人” / “仅限图片”:
- cookies(来自已登录账户,
~/.config/watch/cookies.txt); - 一个 PO-token(来源证明)—— 由
bgutil本地生成(脚本模式,Node); - 解决 n-challenge —— 一个 Node 运行时 + 一个 EJS 组件
(
--remote-components ejs:github)。 所有这些都已内置到yt.sh中——只需调用它。直接的 mp4/Loom/Zoom 源没有这些防御。如果再次要求“确认您不是机器人”,说明 cookies 已过期——请用户提供新的cookies.txt。
5. 分析
- 读取转录文件(
.srt)。 - 查看抽取的帧图像(通过 Read 工具进行视觉分析):幻灯片、代码、演示、图形。
- 使用时间戳将视觉内容与转录关联起来。
6. 报告
提供:
- 摘要(3–5 行);
- 带时间戳的关键概念;
- 屏幕上显示但文本中没有的内容(图表、界面、演示);
- 带时间戳的值得注意的时刻/引用。
7. 保存到知识库(先询问)
询问:“将此分析保存到您的知识库(Obsidian)?”如果同意,将 Markdown 笔记写入相应文件夹,并附带相关笔记的链接。未经确认不要保存。
规则
- 工作文件放入临时文件夹
/tmp/watch/<slug>—— 不要弄乱项目目录。 - 未经明确要求,不要公开或外部发送任何内容。
- 不要绕过受登录保护的私有视频——应向用户说明。