forked from nilaoda/BBDown
-
Notifications
You must be signed in to change notification settings - Fork 18
Architecture and Design
aliveranme edited this page Aug 18, 2026
·
2 revisions
本文档深入剖析 BBDown 的内部代码结构、分层设计、解析工厂模型、原生 Widevine CDM 实现机制以及网络可靠性工程设计。
BBDown 采用清晰的分层架构设计,各层职能严格解耦:
+-------------------------------------------------------------------+
| BBDown (应用与命令行层) |
| - 命令行解析与参数绑定 (Spectre.Console.Cli) |
| - 控制台富文本与动态进度条渲染 (Spectre.Console) |
| - API 服务器 (BBDownApiServer) |
| - 扩展子命令实现 (Live, Article, Sub, WatchLater, Login, Serve) |
+-------------------------------------------------------------------+
|
v
+-------------------------------------------------------------------+
| BBDown.Core (核心引擎层) |
| - FetcherFactory & IFetcher 责任链资源解析引擎 |
| - 视频信息提取与清晰度决策 (Parser / TrackSort) |
| - 原生 C# Widevine CDM 模块 (DRM Decryption) |
| - 分片多线程并发下载引擎 (BBDownDownloadUtil) |
| - 混流与外挂字幕/章节嵌入 (BBDownMuxer - FFmpeg/MP4Box) |
| - 弹幕解析与 ASS 转换引擎 (DanmakuUtil) |
| - 网络与可靠性保障 (HTTPUtil / UpowerGuard / 读停滞看门狗) |
+-------------------------------------------------------------------+
|
v
+-------------------------------------------------------------------+
| External Tools (外部依赖层) |
| FFmpeg | MP4Box | aria2c (可选) |
+-------------------------------------------------------------------+
BBDown 支持解析数十种不同的哔哩哔哩链接形式。系统通过 IFetcher 接口与 FetcherFactory 抽象工厂实现统一解析:
graph TD
Input[用户输入 URL / BV / mid / ss] --> Factory[FetcherFactory.CreateFetcher]
Factory -->|普通视频 / av / bv| F1[NormalInfoFetcher]
Factory -->|番剧 / 电影 / 国创 / ss / ep| F2[BangumiInfoFetcher]
Factory -->|东南亚 / 国际版番剧| F3[IntlBangumiInfoFetcher]
Factory -->|付费课程 / 课堂 / cheese| F4[CheeseInfoFetcher]
Factory -->|UP 主空间全部投稿 / space| F5[SpaceVideoFetcher]
Factory -->|播单 / 媒体列表 / ml| F6[MediaListFetcher]
Factory -->|个人公开收藏夹 / fid| F7[FavListFetcher]
Factory -->|合集与系列 / series| F8[SeriesListFetcher]
F1 & F2 & F3 & F4 & F5 & F6 & F7 & F8 --> ParsedResult[生成统一标准化 ParsedResult]
为了摆脱对 Python 与 pywidevine 庞大运行时的依赖,BBDown 在 BBDown.Core/DRM/ 中纯手工实现了 Widevine L3 CDM 客户端协议:
-
WVD 凭据解析 (
WvdDevice.cs):- 读取并解析二进制
device.wvd文件,提取 RSA 私钥、Client ID 及设备证书链。
- 读取并解析二进制
-
Challenge 构建 (
WidevineCdm.cs):- 提取视频 DASH 清单中的 PSSH 数据盒。
- 使用设备私钥对会话随机数与 PSSH 进行签名,生成符合 Google Widevine 规范的二进制许可证请求(License Challenge)。
-
许可证握手与解密 (
CkcDecryptor.cs/WidevineCrypto.cs):- 向 B 站许可证服务器发送 POST 请求并接收 Content Key Context (CKC)。
- 使用 AES-128-OAEP 解密 CKC 中的内容密钥(Content Key & Key ID)。
- 对下载的 Sample 级加密分片执行原生的 AES-128-CTR / AES-128-CBC 解密。
-
设计背景:当 CDN 节点负载过高或出现半死连接时,TCP 链路可能在握手成功且返回 Response Headers 后发生死锁,此时
HttpClient.Timeout无法约束后续ReadAsync的阻塞,可能导致工作线程永久挂起。 -
看门狗机制:BBDown 为媒体读取管道配备了读停滞看门狗计时器(默认 60 秒),一旦检测到某分片超过阈值未收到后续数据块,立即主动抛出可恢复的
IOException并触发重连退避,彻底避免下载卡死。
-
设计背景:B 站接口在当前账号没有充电权限时,不仅返回
code=0,还会在时长字段伪造完整视频时长,实际只下发前几分钟的试看分段。 -
校验机制:
UpowerGuard通过将媒体流实际下载时长与稿件声明时长进行严格的交叉校验(容差阈值 10%),智能识别出伪造的试看流并主动阻断,避免静默生成残次文件。
-
设计背景:B 站流媒体分发中混杂有边缘 PCDN 节点(通常以
.mcdn.bilivideo.cn为主),这些节点带宽波动大且极不稳定。 - 替换机制:BBDown 默认开启 PCDN 自动探测,并自动将调度 Host 重写为官方优质 UPOS 骨干服务器。
| 上一篇 | 目录导航 | 下一篇 |
|---|---|---|
| ⬅️ API 服务器与 Docker 部署 | 📑 返回目录 | 开发者指南与编译构建 ➡️ |
BBDown Wiki · 由 aliveranme/BBDown 维护 · 基于 MIT 协议开源
- 🏠 首页 (Home)
- 🚀 快速上手 (Getting Started)
- ⚙️ 全命令行参数详解 (CLI Reference)
- 🔑 账号登录与鉴权 (Authentication)
- 📝 配置文件与命名规则 (Configuration)
- 🛠️ 子命令使用指南 (Subcommands)
- 💬 弹幕与评论区抓取 (Danmaku & Comments)
- 📦 批量下载与自动化 (Batch & Automation)
- 🔓 Widevine DRM 原生解密 (DRM Decryption)
- 🌐 API 服务器与 Docker 部署 (API & Docker)
- 🏗️ 内部架构与设计原理 (Architecture)
- 💻 开发者指南与编译构建 (Developer Guide)
- ❓ 常见问题与故障排查 (FAQ)