mcpField
E
extract-moves-from-video

extract-moves-from-video

github.com/letta-ai数据与数据库15236 次安装4 周前更新
代码仓库

关于 extract-moves-from-video

该技能指导从视频画面中识别并提取输入的命令,适用于游戏记录、终端录屏等内容。它涵盖抽帧、OCR 调优、命令清理和结果验证。

主要功能

  1. 01分析视频与文字区域
  2. 02按输入频率抽取视频帧
  3. 03预处理图像并调优 OCR
  4. 04识别提示符并解析命令
  5. 05按时间去重并验证结果

适用场景

  1. 01提取文字冒险游戏中的操作
  2. 02整理终端录屏中的命令
  3. 03转录视频里可见的键入内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/letta-ai/skills --skill extract-moves-from-video

安装后在 Claude Code 中输入/extract-moves-from-video确认已加载。

详细介绍

从视频中提取命令

概述

此技能提供了一套从视频录制中提取文本命令的系统化方法。常见用例包括从文字冒险游戏(如 Zork)中提取游戏命令、从屏幕录制中捕获终端命令,或转录视频内容中可见的任何输入文本。

工作流

第 1 步:分析源视频

处理之前,先了解视频的特征:

  1. 确定视频属性:分辨率、时长、帧率
  2. 识别文本区域:命令在屏幕上的显示位置(例如提示符字符 > 后面)
  3. 评估文本样式:字体类型、颜色、背景对比度(深色背景上的终端文本需要特别处理)
  4. 检查音频:确定音频转录能否补充 OCR(安装 Whisper 等大型软件包之前,先确认音频是否包含相关内容)
  5. 了解输入模式:估算新命令出现的频率,以此确定帧采样率
第 2 步:下载并准备视频
  1. 使用适当的工具下载视频(yt-dlp、youtube-dl 或直接下载)
  2. 继续之前验证下载文件的完整性
  3. 提取视频元数据,确认属性符合预期
第 3 步:有策略地提取帧

提取帧时需要平衡覆盖范围与处理时间:

  1. 先分析命令频率:手动查看一段视频样本,了解新命令出现的频率
  2. 选择合适的采样率:
    • 输入较快:间隔 0.5-1 秒
    • 输入较慢:间隔 2-3 秒
    • 不确定时,先以较高频率提取,再进行二次采样(避免重新提取)
  3. 使用 FFmpeg 提取:
    ffmpeg -i video.mp4 -vf "fps=1" frames/frame_%04d.png
    
  4. 聚焦相关屏幕区域:如果命令出现在特定区域,可将帧裁剪到该区域,以提高 OCR 准确率
第 4 步:优化 OCR 配置

OCR 准确率很大程度上取决于是否针对特定视频类型正确配置:

  1. 先在样本帧上测试:处理所有帧之前,先在 5-10 个有代表性的帧上调整 OCR 设置
  2. 配置 Tesseract 页面分割模式(--psm):
    • --psm 6:假设文本为均匀文本块
    • --psm 7:单行文本
    • --psm 13:原始文本行(视为单行,不进行分析)
  3. 预处理图像以改善 OCR 效果:
    • 二值化:使用适当的阈值转换为黑白图像
    • 如果文字为深色背景上的浅色文字,则反转颜色
    • 对比度较低的视频可提高对比度
    • 放大小号文本(放大 2 倍至 3 倍通常会有帮助)
  4. 测试多个阈值:常见阈值(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 步:提取并解析命令
  1. 对预处理后的帧运行 OCR:使用 Python 绑定(pytesseract),比调用子进程更高效
  2. 识别命令模式:查找命令前面的提示符标记(例如 >、$、>>>)
  3. 谨慎处理 OCR 输出:
    • 不要假设命令从行首开始(OCR 可能会引入空白)
    • 考虑提示符字符识别不完整的情况(例如,> 可能会被识别为 › 或 »)
  4. 使用灵活的模式匹配:
    # More robust than grep "^>"
    import re
    command_pattern = re.compile(r'[>›»]\s*(.+)')
    
第 6 步:清理结果并去重

重要:清理之前,先了解数据领域:

  1. 保留合理的重复项:在许多场景中(游戏、Shell 会话),同一命令可能会有意出现多次
  2. 按时间去重:只删除连续帧中显示同一命令的重复项,不要全局删除所有重复项
  3. 处理未完成的命令:输入过程中的命令会以不完整形式出现;只捕获完整命令
  4. 验证修正:修正 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 步:验证结果

验证对于确保准确性至关重要:

  1. 抽样验证:随机抽取一些样本,手动将提取出的命令与源视频帧进行比较
  2. 领域验证:如果提取的是游戏命令,请确认这些命令对该游戏有效
  3. 序列逻辑检查:确认命令序列符合逻辑(例如,移动命令遵循合理的路径)
  4. 数量验证:根据视频时长和打字速度,将提取出的命令总数与预期数量进行比较

常见问题

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