字幕只是开始:claude-real-video的--text-anchors文字锚点,让LLM看懂屏幕上的每一行字
【免费下载链接】claude-real-videoLet Claude (or any LLM) actually watch a video — scene-aware, deduplicated frames + transcript, from a URL or local file. Runs locally, MIT.项目地址: https://gitcode.com/gh_mirrors/cl/claude-real-video
claude-real-video 是一个让 LLM 真正"看懂"视频的开源工具:它从 URL 或本地文件里提取场景关键帧 + 带时间戳的字幕文本,全程本地运行。而它的--text-anchors(文字锚点)参数更进一步——在每条字幕出现的时间点强制抓取一帧画面,让屏幕上逐行变化的文字、图表、文字卡片,都能被模型亲眼看到,而不是只听到"嘴上说的那部分"。
为什么字幕只是开始?
大多数"让 AI 看视频"的方案,本质是读转录文本。但有一类内容,含义变化得比画面还快:
- 📺录屏教程:画面静止一分钟,代码却改了十行
- 🎓课程讲座:幻灯片不动,讲师讲了三个知识点
- 📱文字卡片短视频:黑底白字,一句一句话术在切换
crv 的核心逻辑是"检测到场景变化才取帧"。画面不动,就取不到帧——于是屏幕上信息最密集的时刻,反而被漏掉了。
上面这张图是一个中文录屏的默认分析结果:crv 只保留了 6 帧。演示中最信息量大的"五条要点完整渲染"的画面,其实被漏掉了——这正是场景检测的盲区。
--text-anchors 是如何工作的?
文字锚点的设计思路很直接:字幕的时间戳,就是文字在屏幕上"换装"的时刻。
第 1 步:找到视频自带的字幕时间戳
crv 按固定顺序找字幕:
- 本地文件旁边的
.srt/.vtt副字幕文件(sidecar) - 视频内嵌的字幕轨道(比如 YouTube 下载下来的软字幕)
对应实现在_subtitle_cue_times:拿到每一条字幕的起始秒数;如果视频根本没有字幕,就返回空列表,安静跳过。
第 2 步:把时间戳换算成"必须抓取的帧"
_text_anchor_frames把每条字幕的起始时间换算成帧序号,并有一个保护机制:每秒最多强制一帧。密集字幕(卡拉OK式逐字、快速对白)不会把抽取过程拖垮。
这些强制帧会合进 crv 原有的同一次 ffmpeg 抽取路径里(extract_frames),时间顺序、去重逻辑都不受影响。换句话说:
- 场景检测照旧跑,
--scene、去重阈值一律不变 - 文字锚点只是"额外保底":讲到哪句,就保证有一帧对着那句话
- 与
--adaptive(慢变化内容)兼容,两者可以同时开
第 3 步:窗口模式下依然落在正确位置
如果你用--from/--to只分析视频的一部分,锚点的帧序号会自动重新对齐到窗口起点。这一点有专门的回归测试守护:tests/test_text_anchors.py。
三步上手:最快配置方法
① 安装(需要 ffmpeg,macOS 用brew install ffmpeg):
pip install "claude-real-video[whisper]"② 准备字幕:本地视频放一个同名的.srt或.vtt在旁边即可,例如lecture.mp4+lecture.srt;软字幕则内嵌在视频里。
③ 运行:
crv "https://www.youtube.com/watch?v=..." --text-anchors # 或本地文件 crv lecture.mp4 --text-anchors --frame-width 1600💡 文字本身就是信息量时,记得配合--frame-width 1600——默认 640px 的帧能"找到那一刻",但看不清小字。分析完成后,把crv-out/文件夹(帧 +MANIFEST.txt+transcript.txt)丢给 Claude / ChatGPT / Gemini 提问即可,所有帧都带源视频时间戳。
真实效果与诚实的边界
crv 维护者跑过一套基准测试(见 benchmark/benchmark.md),文字类内容正是默认采样的失分点:
| 场景 | 默认采样 | 结论 |
|---|---|---|
| 中文录屏(58 秒) | 6 帧,漏掉完整要点画面 | 文字填入固定版式,去重器看不见 |
| 快切文字卡片 reel | 3 帧,漏掉约半数话术卡片 | --text-anchors正是为此设计的参数 |
同时要知道它的诚实边界(README 原文):
- ⚠️ 烧录在画面像素里的字幕检测不到——它是靠字幕时间戳工作的,不是 OCR
- ⚠️ 视频必须有副字幕文件或内嵌字幕轨道,否则参数静默不生效
- ✅ 不改变场景检测行为,最多每秒多一帧,token 开销可控
相关源码与文档
- 参数定义:src/claude_real_video/cli.py
- 核心实现(锚点换算 + 字幕读取 + 抽取合并):src/claude_real_video/core.py
- 行为测试:tests/test_text_anchors.py
- 完整参数表与安装指南:README.md
- 给 Agent 的技能说明:skills/claude-real-video-for-agents/SKILL.md
小结
想让 LLM 看懂视频,光有"它说了什么"还不够——还得有"它画出了什么"。--text-anchors用字幕时间戳给帧抽取上了一道保险:每一句话,都有一帧对应的画面。一个开关,成本极低,却让录屏、讲座、文字卡这类内容的理解质量发生质变。🎬
【免费下载链接】claude-real-videoLet Claude (or any LLM) actually watch a video — scene-aware, deduplicated frames + transcript, from a URL or local file. Runs locally, MIT.项目地址: https://gitcode.com/gh_mirrors/cl/claude-real-video
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考