This repository has been archived on 2026-02-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
openclaw-skills/skills/bilibili-analyzer/SKILL.md
T
OpenClaw Agent 2f5a269866 feat(bilibili-analyzer): 支持字幕区域裁剪
- 新增 --crop-ratio 参数,提取底部1/N区域(默认1/4)
- 新增 --no-crop 参数,禁用裁剪提取完整帧
- 优化字幕识别效率,只处理字幕区域
2026-02-09 23:51:42 +08:00

14 KiB
Raw Blame History

name, description, metadata, source
name description metadata source
bilibili-analyzer 自动分析B站视频内容,下载视频并拆解成帧图片,使用OCR识别文字并生成详细的专题文档或实操教程。
short-description
B站视频分析工具(使用RapidOCR)
name repository documentation license
FFmpeg https://github.com/FFmpeg/FFmpeg https://ffmpeg.org/documentation.html LGPL/GPL
name documentation
Bilibili API https://github.com/SocialSisterYi/bilibili-API-collect
name repository documentation license
RapidOCR https://github.com/RapidAI/RapidOCR https://rapidai.github.io/RapidOCRDocs/ Apache-2.0

Bilibili Video Analyzer

Description

B站视频内容分析工具。提供视频URL后,自动下载视频、拆解成帧图片,然后使用AI分析内容,最终生成高质量的专题文档或实操教程。

核心特点:

  • 不是简单的时间线记录,而是重新组织整理成一篇完整的文档
  • 实操类视频 → 生成可直接使用的操作教程
  • 知识类视频 → 生成结构化的专题文档
  • 报告中插入关键截图,使用 ![描述](./images/frame_xxxx.jpg) 格式

Source & Documentation

工具 用途 文档
FFmpeg 视频拆帧 官网 / 文档
Bilibili API 视频下载 API文档
RapidOCR 中文文字识别 GitHub

Installation

1. 安装 .NET 10 SDK

脚本使用 .NET 10 单文件执行功能,需要安装 .NET 10 SDK。

下载地址: https://dotnet.microsoft.com/download/dotnet/10.0

验证安装:

dotnet --version

2. 安装 FFmpeg

Windows:

# Chocolatey
choco install ffmpeg

# 或 Scoop
scoop install ffmpeg

# 或手动下载: https://ffmpeg.org/download.html

macOS:

brew install ffmpeg

Linux:

# Ubuntu/Debian
sudo apt install ffmpeg

# CentOS/RHEL
sudo yum install ffmpeg

验证安装:

ffmpeg -version

3. 安装 RapidOCR(用于文字识别)

使用 Python 虚拟环境安装:

# 创建虚拟环境
python3 -m venv .venv

# 安装 RapidOCR
.venv/bin/pip install rapidocr_onnxruntime

# 验证安装
.venv/bin/python -c "from rapidocr_onnxruntime import RapidOCR; print('RapidOCR installed successfully')"

RapidOCR 说明:

  • 专门针对中文优化,识别率高
  • 轻量级,支持 CPU/GPU 推理
  • 开源免费,无需 API 密钥

Trigger

  • /bilibili-analyzer 命令
  • 用户请求分析B站视频
  • 用户提供B站视频链接并要求分析

Provided Script

本 skill 提供了 scripts/prepare.cs 脚本用于下载视频和提取帧图片。

脚本位置: skills/tools/bilibili-analyzer/scripts/prepare.cs

运行方式: 使用 .NET 10 单文件执行功能

使用方法

# 基本用法(默认裁剪底部1/4,用于提取字幕)
dotnet run scripts/prepare.cs "<视频URL>" -o <输出目录>

# 示例
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./output

# 长视频(降低帧率)
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./output --fps 0.5

# 提取全帧(不裁剪)
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./output --no-crop

# 调整裁剪比例(底部1/2)
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./output --crop-ratio 2

参数说明

参数 说明 默认值
url B站视频URL(必需) -
-o, --output 输出目录 当前目录
--fps 每秒提取帧数 1.0
--similarity 相似度阈值(0-1),超过此值的相邻帧会被去重 0.80
--no-dedup 禁用相似帧去重 false
--crop-ratio 裁剪比例(提取底部1/N) 4(底部1/4)
--no-crop 禁用裁剪,提取完整帧 false
--video-only 只下载视频,不提取帧 false
--frames-only 只提取帧(需已有video.mp4) false

相似帧去重

脚本会自动对相邻帧进行相似度检测,去除相似度超过阈值(默认80%)的重复帧:

  • 使用 ffmpeg 的 SSIM/PSNR 算法计算相似度
  • 只比较相邻帧,不会跨帧比较
  • 去重后自动重新编号(frame_0001.jpg, frame_0002.jpg, ...)
  • 可通过 --similarity 0.85 调整阈值
  • 可通过 --no-dedup 禁用去重

输出结构

<输出目录>/
├── video.mp4           # 下载的视频文件
└── images/             # 帧图片目录
    ├── frame_0001.jpg
    ├── frame_0002.jpg
    ├── frame_0003.jpg
    └── ...

Workflow (Prompt)

你是一个视频内容分析助手。当用户提供B站视频链接时,按以下步骤执行:

Step 1: 下载视频并拆帧

使用提供的脚本下载视频并拆解成帧图片:

dotnet run skills/tools/bilibili-analyzer/scripts/prepare.cs "<视频URL>" -o <输出目录>

注意事项:

  • 短视频(<10分钟): 使用默认 --fps 1
  • 中等视频(10-30分钟): 使用 --fps 0.5
  • 长视频(>30分钟): 使用 --fps 0.2

Step 2: 分析帧图片

使用 RapidOCR 工具批量识别 images/ 目录中的图片中的文字内容。

2.1 创建 OCR 分析脚本

在输出目录创建 analyze_frames.py 脚本:

#!/usr/bin/env python3
"""批量使用 RapidOCR 分析帧图片"""

from rapidocr_onnxruntime import RapidOCR
import os
import json
from pathlib import Path

# 初始化 OCR
print("🔧 初始化 RapidOCR...")
ocr = RapidOCR()

# 图片目录
images_dir = "images"

# 收集所有图片文件
image_files = sorted(Path(images_dir).glob("*.jpg"))

print(f"\n📸 找到 {len(image_files)} 张图片\n")

# 分析结果
analysis_results = {}

for idx, img_path in enumerate(image_files, 1):
    frame_name = img_path.name
    print(f"[{idx}/{len(image_files)}] 分析 {frame_name}...")

    # 执行 OCR
    result, _ = ocr(str(img_path))

    # 提取文字
    if result:
        texts = [text for _, text, _ in result]
        analysis_results[frame_name] = {
            "text_count": len(texts),
            "texts": texts
        }
    else:
        analysis_results[frame_name] = {
            "text_count": 0,
            "texts": []
        }

# 保存结果
output_file = "ocr_results.json"
with open(output_file, 'w', encoding='utf-8') as f:
    json.dump(analysis_results, f, ensure_ascii=False, indent=2)

print(f"\n✅ 分析完成!结果已保存到 {output_file}")
print(f"📊 总计识别了 {sum(r['text_count'] for r in analysis_results.values())} 处文字\n")

2.2 执行 OCR 分析

cd <输出目录>
.venv/bin/python analyze_frames.py

2.3 分析策略

根据图片数量调整:

总图片数 建议处理方式
< 100 直接处理全部图片
100-300 正常处理(5-10分钟)
300-500 处理时间较长(10-20分钟)
> 500 考虑降低 fps 重新拆帧

输出说明:

生成 ocr_results.json 文件,格式如下:

{
  "frame_0001.jpg": {
    "text_count": 4,
    "texts": [
      "bilibili",
      "IT咖啡馆",
      "GitHub",
      "GitHub一周热点汇总第102期"
    ]
  },
  "frame_0002.jpg": {
    "text_count": 27,
    "texts": [...]
  }
}

2.4 人工审核与补充

OCR 识别后的人工分析步骤:

  1. 读取 OCR 结果

    cat ocr_results.json | less
    
  2. 筛选关键帧

    • 选择文字识别较多的帧(通常有重要内容)
    • 选择包含代码、配置、界面的帧
    • 选择有独特内容的帧(标题、总结等)
  3. 人工查看关键帧

    # 使用图片查看器浏览
    eog images/frame_0101.jpg  # Linux
    open images/frame_0101.jpg  # macOS
    
  4. 补充视觉信息(OCR 无法提供)

    • 界面布局和结构
    • 图标、按钮、菜单位置
    • 操作步骤的视觉展示
    • 代码高亮和格式
    • 截图的截图(嵌套界面)

分析要点:

  1. 完整转录所有文字和代码内容
  2. 详细描述界面元素和操作步骤
  3. 记录每张图片的关键信息
  4. 标注重要的截图帧号(如 frame_0042.jpg)
  5. 区分字幕内容(B站弹幕、字幕)和界面文字

Step 3: 生成文档

根据视频类型,将分析结果重新组织整理成 视频分析.md:

判断视频类型:

  • 实操类: 编程教程、软件操作、配置演示等
  • 知识类: 概念讲解、原理分析、经验分享等

【关键】图片与内容必须严格对应:

错误示例 ❌:
### 安装 Node.js
首先下载 Node.js...
![截图](./images/frame_0001.jpg)  ← 图片可能是其他内容

正确示例 ✅:
### 安装 Node.js
首先下载 Node.js...
![frame_0015: Node.js官网下载页面](./images/frame_0015.jpg)  ← 图片确实是下载页面

生成文档的正确流程:

  1. 先整理 OCR 识别结果

    • 读取 ocr_results.json 文件
    • 汇总所有帧的文字内容
    • 建立「帧号 → 文字内容」的对应关系
  2. 按主题重新组织内容(不是按时间顺序)

    • 将相关内容归类到同一章节
    • 确定每个章节需要哪些帧的信息
    • 按逻辑顺序组织,而不是按视频时间线
  3. 插入图片时必须核对

    • 只插入与当前内容直接相关的图片
    • 图片描述要准确反映图片实际内容
    • 使用格式: ![frame_xxxx: 图片实际内容描述](./images/frame_xxxx.jpg)
  4. 代码必须来自图片中的实际代码

    • 不要自己编造代码
    • 代码块标注来源: <!-- 来自 frame_0025 -->

重要原则:

  1. 图文对应 - 每张图片必须与其上下文内容匹配
  2. 不要时间线流水账 - 重新组织内容,像写文章一样
  3. 结构清晰 - 有章节划分和逻辑顺序
  4. 代码真实 - 只使用图片中出现的代码,不要编造
  5. 独立可读 - 不看视频也能完全理解

Output Format

实操教程类

# {教程主题}

## 简介

{教程目标}
{前置条件和要求}

## 环境准备

{需要安装的软件}
{配置要求}

## 操作步骤

### 1. {步骤标题}

{详细说明,内容必须与下方图片对应}

![frame_xxxx: 图片实际内容的准确描述](./images/frame_xxxx.jpg)

<!-- 代码来自 frame_xxxx -->
```代码块```

### 2. {步骤标题}

{详细说明}

![frame_xxxx: 准确描述](./images/frame_xxxx.jpg)

...

## 完整代码

<!-- 汇总自 frame_xxxx, frame_xxxx, frame_xxxx -->
{汇总所有代码片段,标注来源帧号}

## 常见问题

{可能遇到的问题和解决方案}

## 总结

{核心要点回顾}
{延伸学习建议}

知识文档类

# {主题}

## 概述

{主题背景介绍}
{为什么重要}

## {章节1标题}

{内容,必须与配图对应}

![frame_xxxx: 图片实际内容描述](./images/frame_xxxx.jpg)

## {章节2标题}

{内容}

![frame_xxxx: 图片实际内容描述](./images/frame_xxxx.jpg)

## 核心要点

- 要点1
- 要点2
- 要点3

## 延伸阅读

{相关资源和建议}

图片插入规范

规则 说明
帧号必须标注 ![frame_0015: 描述](./images/frame_0015.jpg)
描述必须准确 描述图片的实际内容,不是期望内容
内容必须匹配 图片上方/下方的文字必须与图片内容相关
代码标注来源 <!-- 代码来自 frame_0025 -->
不要乱插图 没有合适的图就不插,不要强行配图

API Reference

Bilibili API

脚本使用 Bilibili 官方 API 下载视频:

# 获取视频信息
GET https://api.bilibili.com/x/web-interface/view?bvid=BV1xx411c7mD

# 获取播放地址
GET https://api.bilibili.com/x/player/playurl?bvid=BV1xx411c7mD&cid={cid}&qn=80&fnval=1

API 文档: https://github.com/SocialSisterYi/bilibili-API-collect

FFmpeg 拆帧命令

# 每秒1帧
ffmpeg -i video.mp4 -vf "fps=1" -q:v 2 images/frame_%04d.jpg

# 每秒0.5帧(每2秒1帧)
ffmpeg -i video.mp4 -vf "fps=0.5" -q:v 2 images/frame_%04d.jpg

# 指定时间范围
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:05:00 -vf "fps=1" -q:v 2 images/frame_%04d.jpg

# 提取关键帧(场景变化)
ffmpeg -i video.mp4 -vf "select='gt(scene,0.3)'" -vsync vfr -q:v 2 images/frame_%04d.jpg

更多选项: https://ffmpeg.org/ffmpeg.html

Examples

示例1: 分析编程教程

# 1. 下载并拆帧
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./react-tutorial

# 2. 使用 RapidOCR 分析图片
cd ./react-tutorial
.venv/bin/python analyze_frames.py

# 3. 根据 ocr_results.json 生成视频分析.md

示例2: 分析长视频

# 降低帧率,减少图片数量
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./long-video --fps 0.2

示例3: 只下载视频

dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./output --video-only

Quality Checklist

生成文档前,逐项检查以下要求:

内容质量

  • 内容重新组织,不是时间线流水账
  • 章节结构清晰,有逻辑顺序
  • 不看视频也能理解全部内容
  • 包含环境准备/前置条件说明
  • 包含总结和核心要点

图文对应(重要!)

  • 每张图片都标注了帧号: ![frame_xxxx: 描述](...)
  • 图片描述准确反映图片实际内容
  • 图片上下文的文字与图片内容直接相关
  • 没有随意插入不相关的图片
  • 代码块标注了来源帧号: <!-- 来自 frame_xxxx -->

���码质量

  • 代码来自图片中的实际代码,不是编造的
  • 代码片段完整,可直接复制使用
  • 完整代码章节汇总了所有代码并标注来源

Tags

bilibili, video-analysis, ai, frame-extraction, markdown, tutorial, ffmpeg, dotnet

Compatibility

  • Codex: Yes
  • Claude Code: Yes