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

563 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: bilibili-analyzer
description: 自动分析B站视频内容,下载视频并拆解成帧图片,使用OCR识别文字并生成详细的专题文档或实操教程。
metadata:
short-description: B站视频分析工具(使用RapidOCR)
source:
- name: FFmpeg
repository: https://github.com/FFmpeg/FFmpeg
documentation: https://ffmpeg.org/documentation.html
license: LGPL/GPL
- name: Bilibili API
documentation: https://github.com/SocialSisterYi/bilibili-API-collect
- name: RapidOCR
repository: https://github.com/RapidAI/RapidOCR
documentation: https://rapidai.github.io/RapidOCRDocs/
license: Apache-2.0
---
# Bilibili Video Analyzer
## Description
B站视频内容分析工具。提供视频URL后,自动下载视频、拆解成帧图片,然后使用AI分析内容,最终生成**高质量的专题文档或实操教程**。
**核心特点**:
- 不是简单的时间线记录,而是**重新组织整理**成一篇完整的文档
- 实操类视频 → 生成**可直接使用的操作教程**
- 知识类视频 → 生成**结构化的专题文档**
- 报告中插入关键截图,使用 `![描述](./images/frame_xxxx.jpg)` 格式
## Source & Documentation
| 工具 | 用途 | 文档 |
|------|------|------|
| **FFmpeg** | 视频拆帧 | [官网](https://ffmpeg.org/) / [文档](https://ffmpeg.org/ffmpeg.html) |
| **Bilibili API** | 视频下载 | [API文档](https://github.com/SocialSisterYi/bilibili-API-collect) |
| **RapidOCR** | 中文文字识别 | [GitHub](https://github.com/RapidAI/RapidOCR) |
## Installation
### 1. 安装 .NET 10 SDK
脚本使用 .NET 10 单文件执行功能,需要安装 .NET 10 SDK。
下载地址: https://dotnet.microsoft.com/download/dotnet/10.0
验证安装:
```bash
dotnet --version
```
### 2. 安装 FFmpeg
**Windows:**
```powershell
# Chocolatey
choco install ffmpeg
# 或 Scoop
scoop install ffmpeg
# 或手动下载: https://ffmpeg.org/download.html
```
**macOS:**
```bash
brew install ffmpeg
```
**Linux:**
```bash
# Ubuntu/Debian
sudo apt install ffmpeg
# CentOS/RHEL
sudo yum install ffmpeg
```
验证安装:
```bash
ffmpeg -version
```
### 3. 安装 RapidOCR(用于文字识别)
**使用 Python 虚拟环境安装:**
```bash
# 创建虚拟环境
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 单文件执行功能
### 使用方法
```bash
# 基本用法(默认裁剪底部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: 下载视频并拆帧
使用提供的脚本下载视频并拆解成帧图片:
```bash
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` 脚本:
```python
#!/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 分析
```bash
cd <输出目录>
.venv/bin/python analyze_frames.py
```
#### 2.3 分析策略
**根据图片数量调整:**
| 总图片数 | 建议处理方式 |
|---------|-------------|
| < 100 | 直接处理全部图片 |
| 100-300 | 正常处理(5-10分钟) |
| 300-500 | 处理时间较长(10-20分钟) |
| > 500 | 考虑降低 fps 重新拆帧 |
**输出说明:**
生成 `ocr_results.json` 文件,格式如下:
```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 结果**
```bash
cat ocr_results.json | less
```
2. **筛选关键帧**
- 选择文字识别较多的帧(通常有重要内容)
- 选择包含代码、配置、界面的帧
- 选择有独特内容的帧(标题、总结等)
3. **人工查看关键帧**
```bash
# 使用图片查看器浏览
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
### 实操教程类
```markdown
# {教程主题}
## 简介
{教程目标}
{前置条件和要求}
## 环境准备
{需要安装的软件}
{配置要求}
## 操作步骤
### 1. {步骤标题}
{详细说明,内容必须与下方图片对应}
![frame_xxxx: 图片实际内容的准确描述](./images/frame_xxxx.jpg)
<!-- 代码来自 frame_xxxx -->
```代码块```
### 2. {步骤标题}
{详细说明}
![frame_xxxx: 准确描述](./images/frame_xxxx.jpg)
...
## 完整代码
<!-- 汇总自 frame_xxxx, frame_xxxx, frame_xxxx -->
{汇总所有代码片段,标注来源帧号}
## 常见问题
{可能遇到的问题和解决方案}
## 总结
{核心要点回顾}
{延伸学习建议}
```
### 知识文档类
```markdown
# {主题}
## 概述
{主题背景介绍}
{为什么重要}
## {章节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 拆帧命令
```bash
# 每秒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: 分析编程教程
```bash
# 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: 分析长视频
```bash
# 降低帧率,减少图片数量
dotnet run scripts/prepare.cs "https://www.bilibili.com/video/BV1xx411c7mD" -o ./long-video --fps 0.2
```
### 示例3: 只下载视频
```bash
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