尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Bilibili-Evolved 弹幕下载功能深度解析:XML / JSON / ASS 三种格式的获取原理与播放器设置联动

Bilibili-Evolved 弹幕下载功能深度解析:XML / JSON / ASS 三种格式的获取原理与播放器设置联动 Bilibili-Evolved 弹幕下载功能深度解析XML / JSON / ASS 三种格式的获取原理与播放器设置联动【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved导读本文基于 Bilibili-Evolved 仓库中registry/lib/components/video/danmaku/download组件的实现完整解析下载弹幕功能的三种输出格式XML、JSON、ASS、基于 protobuf 的分段拉取流程以及 ASS 转换如何自动继承哔哩哔哩播放器内的屏蔽与显示设置。读完本文你将掌握该功能从功能面板点击到文件落盘的全链路原理并能在此基础上自行扩展弹幕导出能力。功能定位与使用入口在视频含番剧页面中启用该功能后即可从功能面板下载当前视频的弹幕。组件元数据定义在 index.ts其关键字段如下name: downloadDanmaku、displayName: 下载弹幕标签为componentsTags.video属于视频类组件urlInclude: videoAndBangumiUrls即仅在视频与番剧页面生效widget.condition: hasVideo功能面板图标仅在检测到视频时显示组件无独立入口entry: none下载能力完全通过功能面板按钮与下载视频插槽两种途径暴露。功能面板三种格式一键下载功能面板组件 DownloadDanmaku.vue 渲染了三个并列的DefaultWidget按钮分别对应按钮名称触发类型下载弹幕 (XML)download(xml)下载弹幕 (JSON)download(json)下载弹幕 (ASS)download(ass)点击后组件通过getFriendlyTitle()取得页面友好标题调用getBlobByType(type)生成 Blob再交给DownloadPackage.single直接下载文件名形如视频标题.xml。下载过程中按钮会置灰disabled以防止重复触发异常则通过logError记录。与下载视频功能的集成除独立下载外该组件还以插件形式注册到视频下载流程中index.ts 中的plugin.setup通过addData(downloadVideo.assets, ...)向下载视频功能注册一个额外产物DownloadVideoAssets其类型定义见 types.ts在批量下载视频时对每个视频输入调用getBlobByType获取对应格式的弹幕 Blob并返回{ name: \${title}.${type}, data: blob } 作为下载包条目使用Promise.allSettled并发处理多个视频实时通过 Toast 显示进度获取弹幕中... (n/m)完成后提示成功与失败数量格式选择由 Plugin.vue 提供下拉项为[无, ass, json, xml]选择结果写入downloadVideo组件的options.danmakuType。三种下载格式及其数据来源DanmakuDownloadType json | xml | ass定义于 utils.ts。所有格式都基于同一份内存数据模型JsonDanmaku它保存了每条弹幕的id / progress / mode / fontsize / color / midHash / content / ctime / weight / pool / attr等字段——这与下文的 protobuf 响应字段一一对应。getBlobByType(type, { aid, cid })的最终分发逻辑JSON直接将jsonDanmakus数组序列化为缩进 2 空格的美化 JSONMIME 类型text/json保留弹幕最原始的结构化信息XML通过convertToXmlFromJson重新生成符合哔哩哔哩标准的 XML 文档MIME 类型text/xmlASS先经convertToAssFromJson调用DanmakuConverter做完整字幕转换MIME 类型text/ass。JSON 格式JSON 是最忠实的原始数据形态每条弹幕包含progress毫秒、mode弹幕类型、fontsize、color十进制颜色值、midHash用户哈希、ctime发送时间戳等全部字段适合程序化二次处理例如做弹幕统计、情感分析或自建弹幕库。XML 格式convertToXmlFromJson生成的 XML 文档结构如下danmaku.cid作为chatidmaxlimit为弹幕总数?xml version1.0 encodingUTF-8? i chatserverchat.bilibili.com/chatserver chatid123456/chatid mission0/mission maxlimit2048/maxlimit state0/state real_name0/real_name sourcek-v/source d p10.60800,5,25,16724991,1544806627,0,6d16be9f,9261260365889536biu/d /i其中每条d标签的属性顺序由JsonDanmaku.xmlDanmakus映射而来发送时间(秒) / 弹幕类型 / 字体相对大小 / 颜色 / Unix时间戳 / 弹幕池 / 用户Hash / 行序号各字段含义可参考仓库内的格式设计笔记 danmaku-converter.md。生成的 XML 可直接被第三方播放器如 PotPlayer、mpv 弹幕插件加载。ASS 格式与内置限制ASS 是最适合直接作为字幕文件使用的格式但需要注意组件说明中明确写出的限制请注意 ASS 弹幕下载不会包含高级弹幕, 字幕弹幕等。该限制的实现依据在转换配置中默认blockTypes: [7, 8]而 7~8 正是高级弹幕类型见 danmaku-converter.md 的弹幕类型表1~3 普通、4 底端、5 顶端、6 逆向、7~8 高级。DanmakuConverter.xmlDanmakuToAssDocumentdanmaku-converter.ts在处理时会跳过这些类型同时也会跳过命中用户屏蔽词/屏蔽用户的弹幕。底层数据获取基于 protobuf 的分段弹幕拉取弹幕原始数据并非一次接口调用即可获取而是先请求配置接口获知分段总数再并发拉取各分段。这一流程封装在JsonDanmaku.fetchInfo()中实际网络请求位于 danmaku-segment.ts获取弹幕配置getDanmakuView(aid, cid)请求https://api.bilibili.com/x/v2/dm/web/view?type1oid{cid}pid{aid}得到DmWebViewReply其中dmSge.total表示弹幕分段总数并发拉取分段getDanmakuSegment(aid, cid, index)请求https://api.bilibili.com/x/v2/dm/web/seg.so?type1oid{cid}pid{aid}segment_index{index1}返回DmSegMobileReplyelems为该段弹幕列表解码与合并响应为 protobuf 二进制通过运行时加载的 protobuf 库protobufLibrary按proto中定义的消息结构解码再flat()合并全部分段按progress升序排序后存入jsonDanmakus。从源码结构可以推断分段并发拉取的方式对大弹幕量的视频如热门番剧、演唱会能显著缩短等待时间任何一段失败都会向上抛出由调用方的Promise.allSettled汇总为失败 n 个的提示。ASS 转换原理自动继承播放器设置ASS 下载的独特价值在于转换结果并非固定模板而是自动继承用户当前播放器内的弹幕显示与屏蔽设置。这一逻辑集中在getUserDanmakuConfig()utils.ts其读取链路为调用loadDanmakuSettingsPanel()确保设置就绪 → 读取localStorage中的bilibili_player_settings→ 通过playerAgent.getPlayerConfig逐项读取。默认配置无播放器设置时的兜底配置项默认值含义font微软雅黑弹幕字体alpha0.4弹幕透明度duration顶部/底端 4 秒其余 6 秒单条弹幕持续时长blockTypes[7, 8]屏蔽的弹幕类型高级弹幕resolution1920 × 1080字幕画布分辨率bottomMarginPercent0.15底部留白比例防挡字幕boldfalse是否加粗与播放器设置的联动项屏蔽类型读取block.type_scroll / type_top / type_bottom / type_color四项开关分别映射为滚动(1,2,3)、顶端(5)、底端(4)、彩色弹幕未屏蔽的类型才参与转换并始终追加 7、8高级弹幕不转换加粗dmSetting.bold透明度alpha 1 - dmSetting.opacity经lodash.clamp(…, 0, 1)约束范围分辨率由dmSetting.fontsize计算缩放因子resolutionFactor 1.4 - 0.4 × fontsize默认 1再乘以 1920×1080 得到画布尺寸——播放器字号越大导出的 ASS 画布越大以保持视觉比例一致持续时长滚动弹幕时长按18 - 3 × speed计算speed取自dmSetting.speedplus或组件隐藏选项downloadDanmakuOptions.speed手动指定见 options.ts默认auto顶部/底端固定 4 秒底部间距dmSetting.danmakuArea小于 100 时按百分比换算等于 100无区域限制时归零此时若开启防挡字幕dmSetting.preventshade则回退为 0.15用户屏蔽读取block.list逐条支持三种屏蔽类型——keyword内容包含关键词、regexp正则匹配、user按userHash匹配命中即从 ASS 中剔除且只应用处于开启状态s: true的条目字体直接从页面 DOM 中读取播放器弹幕设置面板当前选中的字体文本选择器为.bilibili-player-video-danmaku-setting-right-font或新版.bpx-player-dm-setting-right-content-fontfamily下的.bui-select-result因为 localStorage 中保存的是更复杂的 font-family 解析串。若读取失败或未找到播放器设置bilibili_player_settings不存在则整体回退到上表默认配置保证任何环境下都能正常导出。XML → ASS 的格式转换细节转换器 DanmakuConverter 按 danmaku-converter.md 中记录的 ASS 规范生成字幕按字体大小18/25/30/36/45映射为 Small/Medium/Large/Larger/ExtraLarge 五种样式字号分别为 36/52/64/72/90并通过alpha生成形如H66FFFFFF的 ASS 颜色HAA为透明度十六进制颜色以\cHbbggrr形式输出注意 BGR 字节序边框色用\2c滚动弹幕使用\move(x1,y1,x2,y2)标签固定弹幕使用\pos(X,Y)底部留白由DanmakuStack依据bottomMarginPercent计算纵向位置避免弹幕堆叠重叠弹幕内容经normalizeContent规范化处理避免非法字符破坏字幕文件。相关源码文件索引组件入口与插件注册下载逻辑与配置读取功能面板按钮下载视频集成面板组件隐藏选项protobuf 弹幕接口与解码ASS 转换器XML / ASS 格式设计笔记视频下载额外产物类型定义以上即可完整回答下载弹幕功能的三个核心问题数据从哪来protobuf 分段接口、能导出成什么JSON / XML / ASS、导出时如何继承用户设置播放器设置联动与 ASS 转换器。【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表