--- 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. **代码必须来自图片中的实际代码** - 不要自己编造代码 - 代码块标注来源: `` **重要原则**: 1. **图文对应** - 每张图片必须与其上下文内容匹配 2. **不要时间线流水账** - 重新组织内容,像写文章一样 3. **结构清晰** - 有章节划分和逻辑顺序 4. **代码真实** - 只使用图片中出现的代码,不要编造 5. **独立可读** - 不看视频也能完全理解 ## Output Format ### 实操教程类 ```markdown # {教程主题} ## 简介 {教程目标} {前置条件和要求} ## 环境准备 {需要安装的软件} {配置要求} ## 操作步骤 ### 1. {步骤标题} {详细说明,内容必须与下方图片对应} ![frame_xxxx: 图片实际内容的准确描述](./images/frame_xxxx.jpg) ```代码块``` ### 2. {步骤标题} {详细说明} ![frame_xxxx: 准确描述](./images/frame_xxxx.jpg) ... ## 完整代码 {汇总所有代码片段,标注来源帧号} ## 常见问题 {可能遇到的问题和解决方案} ## 总结 {核心要点回顾} {延伸学习建议} ``` ### 知识文档类 ```markdown # {主题} ## 概述 {主题背景介绍} {为什么重要} ## {章节1标题} {内容,必须与配图对应} ![frame_xxxx: 图片实际内容描述](./images/frame_xxxx.jpg) ## {章节2标题} {内容} ![frame_xxxx: 图片实际内容描述](./images/frame_xxxx.jpg) ## 核心要点 - 要点1 - 要点2 - 要点3 ## 延伸阅读 {相关资源和建议} ``` ### 图片插入规范 | 规则 | 说明 | |------|------| | **帧号必须标注** | `![frame_0015: 描述](./images/frame_0015.jpg)` | | **描述必须准确** | 描述图片的实际内容,不是期望内容 | | **内容必须匹配** | 图片上方/下方的文字必须与图片内容相关 | | **代码标注来源** | `` | | **不要乱插图** | 没有合适的图就不插,不要强行配图 | ## 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: 描述](...)` - [ ] 图片描述准确反映图片**实际内容** - [ ] 图片上下文的文字与图片内容**直接相关** - [ ] 没有随意插入不相关的图片 - [ ] 代码块标注了来源帧号: `` ### 代码质量 - [ ] 代码来自图片中的实际代码,不是编造的 - [ ] 代码片段完整,可直接复制使用 - [ ] 完整代码章节汇总了所有代码并标注来源 ## Tags `bilibili`, `video-analysis`, `ai`, `frame-extraction`, `markdown`, `tutorial`, `ffmpeg`, `dotnet` ## Compatibility - Codex: Yes - Claude Code: Yes