Community编程与开发github.com

akimov121-hub/watch

通过URL观看任何视频(YouTube、Loom、Zoom录制、直接mp4链接),不仅能获取文字稿,还能分析屏幕上实际显示的内容。基于场景变化(ffmpeg场景检测)抽取帧画面,而非定时采样,确保不会错过图形、演示、剪辑或B-roll。

watch 是什么?

这是一个专为AI助手设计的视频分析技能,它能够通过URL下载并解析任何视频(支持YouTube、Loom、Zoom录制、直接mp4文件),不仅提取文字转录,还能基于场景变化智能抽取关键帧画面。与传统的定时抽帧不同,它使用ffmpeg的场景检测技术(阈值0.3,可调),确保捕获图形、演示、剪辑和B-roll等视觉内容的变化点。音频转录方面,优先使用yt-dlp获取字幕,失败则回退到Whisper语音识别。该技能需要安装yt-dlp、ffmpeg、Whisper和Node.js等依赖,并提供一键安装脚本。对于YouTube视频,它会自动处理cookie、PO-token和n-challenge等反爬机制。最终输出包含时间戳的转录文本和关键帧图像,AI助手可据此进行完整的视频分析,生成摘要、关键概念和屏幕上的视觉内容报告。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/akimov121-hub/watch/tree/main

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

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 / “不是机器人” / “仅限图片”:

  1. cookies(来自已登录账户,~/.config/watch/cookies.txt);
  2. 一个 PO-token(来源证明)—— 由 bgutil 本地生成(脚本模式,Node);
  3. 解决 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> —— 不要弄乱项目目录。
  • 未经明确要求,不要公开或外部发送任何内容。
  • 不要绕过受登录保护的私有视频——应向用户说明。

相关技能