关于 extract-moves-from-video
该技能指导从视频画面中识别并提取输入的命令,适用于游戏记录、终端录屏等内容。它涵盖抽帧、OCR 调优、命令清理和结果验证。
主要功能
- 01分析视频与文字区域
- 02按输入频率抽取视频帧
- 03预处理图像并调优 OCR
- 04识别提示符并解析命令
- 05按时间去重并验证结果
适用场景
- 01提取文字冒险游戏中的操作
- 02整理终端录屏中的命令
- 03转录视频里可见的键入内容
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ letta-ai/ skills --skill extract-moves-from-video安装后在 Claude Code 中输入/extract-moves-from-video确认已加载。
详细介绍
从视频中提取命令
概述
此技能提供了一套从视频录制中提取文本命令的系统化方法。常见用例包括从文字冒险游戏(如 Zork)中提取游戏命令、从屏幕录制中捕获终端命令,或转录视频内容中可见的任何输入文本。
工作流
第 1 步:分析源视频
处理之前,先了解视频的特征:
- 确定视频属性:分辨率、时长、帧率
- 识别文本区域:命令在屏幕上的显示位置(例如提示符字符
>后面) - 评估文本样式:字体类型、颜色、背景对比度(深色背景上的终端文本需要特别处理)
- 检查音频:确定音频转录能否补充 OCR(安装 Whisper 等大型软件包之前,先确认音频是否包含相关内容)
- 了解输入模式:估算新命令出现的频率,以此确定帧采样率
第 2 步:下载并准备视频
- 使用适当的工具下载视频(
yt-dlp、youtube-dl或直接下载) - 继续之前验证下载文件的完整性
- 提取视频元数据,确认属性符合预期
第 3 步:有策略地提取帧
提取帧时需要平衡覆盖范围与处理时间:
- 先分析命令频率:手动查看一段视频样本,了解新命令出现的频率
- 选择合适的采样率:
- 输入较快:间隔 0.5-1 秒
- 输入较慢:间隔 2-3 秒
- 不确定时,先以较高频率提取,再进行二次采样(避免重新提取)
- 使用 FFmpeg 提取:
ffmpeg -i video.mp4 -vf "fps=1" frames/frame_%04d.png - 聚焦相关屏幕区域:如果命令出现在特定区域,可将帧裁剪到该区域,以提高 OCR 准确率
第 4 步:优化 OCR 配置
OCR 准确率很大程度上取决于是否针对特定视频类型正确配置:
- 先在样本帧上测试:处理所有帧之前,先在 5-10 个有代表性的帧上调整 OCR 设置
- 配置 Tesseract 页面分割模式(
--psm):--psm 6:假设文本为均匀文本块--psm 7:单行文本--psm 13:原始文本行(视为单行,不进行分析)
- 预处理图像以改善 OCR 效果:
- 二值化:使用适当的阈值转换为黑白图像
- 如果文字为深色背景上的浅色文字,则反转颜色
- 对比度较低的视频可提高对比度
- 放大小号文本(放大 2 倍至 3 倍通常会有帮助)
- 测试多个阈值:常见阈值(127、150、180)在不同视频中的效果各异;通过实测确定哪种效果最佳
使用 Python/OpenCV 进行预处理的示例:
import cv2
img = cv2.imread('frame.png', cv2.IMREAD_GRAYSCALE)
# Invert if light text on dark background
img = cv2.bitwise_not(img)
# Binarize with tested threshold
_, img = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY)
# Scale up for better OCR
img = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
第 5 步:提取并解析命令
- 对预处理后的帧运行 OCR:使用 Python 绑定(
pytesseract),比调用子进程更高效 - 识别命令模式:查找命令前面的提示符标记(例如
>、$、>>>) - 谨慎处理 OCR 输出:
- 不要假设命令从行首开始(OCR 可能会引入空白)
- 考虑提示符字符识别不完整的情况(例如,
>可能会被识别为›或»)
- 使用灵活的模式匹配:
# More robust than grep "^>" import re command_pattern = re.compile(r'[>›»]\s*(.+)')
第 6 步:清理结果并去重
重要:清理之前,先了解数据领域:
- 保留合理的重复项:在许多场景中(游戏、Shell 会话),同一命令可能会有意出现多次
- 按时间去重:只删除连续帧中显示同一命令的重复项,不要全局删除所有重复项
- 处理未完成的命令:输入过程中的命令会以不完整形式出现;只捕获完整命令
- 验证修正:修正 OCR 错误时,确认修正符合上下文
按时间去重的方法:
def temporal_dedupe(commands):
"""Remove only consecutive duplicates, preserving repeated commands."""
result = []
prev = None
for cmd in commands:
if cmd != prev:
result.append(cmd)
prev = cmd
return result
第 7 步:验证结果
验证对于确保准确性至关重要:
- 抽样验证:随机抽取一些样本,手动将提取出的命令与源视频帧进行比较
- 领域验证:如果提取的是游戏命令,请确认这些命令对该游戏有效
- 序列逻辑检查:确认命令序列符合逻辑(例如,移动命令遵循合理的路径)
- 数量验证:根据视频时长和打字速度,将提取出的命令总数与预期数量进行比较
常见问题
OCR 质量问题
- 错误:未优化就使用默认 OCR 设置
- 解决方案:先在样本视频帧上调整
--psm模式和图像预处理
去重不正确
- 错误:使用全局去重(例如
awk '!seen[$0]++'),导致所有重复命令都被删除 - 解决方案:使用时间去重,只删除连续重复的命令
提示符检测失败
- 错误:使用
grep "^>"之类的僵化模式,假定格式固定 - 解决方案:使用灵活的正则表达式,以适应 OCR 变化和空白字符
浪费时间安装工具
- 错误:未确认是否需要就安装大型软件包(用于音频的 Whisper)
- 解决方案:安装音频处理工具前,先检查音频是否包含有用内容
缺少中间检查点
- 错误:处理所有视频帧却不保存中间结果,超时后丢失进度
- 解决方案:每个处理阶段结束后保存结果;设置进度检查点
放弃验证
- 错误:不根据源材料验证提取出的命令
- 解决方案:始终抽样验证提取结果,并检查整体序列逻辑
验证清单
在完成命令提取前:
- 已将部分提取出的命令与源视频帧进行核对
- 命令数量与视频时长相符
- 没有明显的 OCR 识别错误(随机字符、单词被拆分)
- 保留了合理的重复命令(没有错误地去重)
- 命令序列顺序符合逻辑
- 已进行领域专项验证(例如,命令对该游戏或应用有效)
工具选择指南
| 任务 | 推荐工具 | 说明 |
|---|---|---|
| 下载视频 | yt-dlp | 维护得比 youtube-dl 更好 |
| 提取视频帧 | ffmpeg | 行业标准,可靠 |
| OCR | 通过 pytesseract 使用 tesseract | 使用 Python 绑定以提高效率 |
| 图像预处理 | OpenCV(cv2) | 灵活且文档完善 |
| 模式匹配 | Python re 模块 | 比 grep 更灵活 |
评论
支持 Markdown