Bilibili 弹幕文件的解析

获取 cid

B 站的每个视频都有 aid(即 AV 号)和 cid 两个参数,而 B 站新的 bvid(BV 号)可以通过 Base58 编码与 aid 互相转换。aidbvid 通过视频的链接就可以获取,而 cid 有以下两种方法查询:

  • 在已知视频 aid 的情况下,可以通过链接 https://api.bilibili.com/x/web-interface/view?aid=10492 获取 cid(将 10492 替换为你要查询的视频的 aid)。
  • 在已知视频 bvid 的情况下,可以通过链接 https://api.bilibili.com/x/web-interface/view?bvid=BV1Lx411a7NQ 获取 cid(将 BV1Lx411a7NQ 替换为你要查询的视频的 bvid)。

对于有许多分 P 的视频,它们的 aid 相同,每个分 P 则对应一个不同的 cid。而在同一个页面下的番剧、影视等内容,每一分集的 cid 也是唯一的。使用上述 API 返回的是 JSON 格式,并且包含了该视频下所有分 P 的 cid,需要进一步处理。
视频的更多信息则可以通过 https://api.bilibili.com/view?type=jsonp&appkey=8e9fc618fbd41e28&id=10492 获取。

获取弹幕

视频的弹幕文件采用 xml 格式存储,地址与其 cid 有关,为 https://comment.bilibili.com/$cid.xml(将 $cid 替换为视频的 cid)。

弹幕内容的存储方式为:

1
<d p="0,1,25,16777215,1312863760,0,eff85771,42759017">前排占位置</d>

这个元素中的各个参数由逗号分割,其意义分别为:

  • 弹幕出现的时间,以秒为单位
  • 弹幕的模式:1~3 滚动弹幕 4 底端弹幕 5 顶端弹幕 6 逆向弹幕 7 精准定位 8 高级弹幕
  • 字号:12 非常小 16 特小 18 小 25 中 36 大 45 很大 64 特别大
  • 字体的颜色:将 HTML 六位十六进制颜色转为十进制表示,例如 #FFFFFF 会被存储为 16777215,因为
  • Unix 时间戳,以毫秒为单位,基准时间为 1970-1-1 08:00:00
  • 弹幕池:0 普通池 1 字幕池 2 特殊池(注:目前特殊池为高级弹幕专用)
  • 发送者的 ID,用于「屏蔽此弹幕的发送者」功能
  • 弹幕在弹幕数据库中 rowID,用于「历史弹幕」功能

将 Bilibili 弹幕的 xml 文件转为 ass 字幕,可以使用以下脚本:
bilibili ASS 弹幕在线转换
us-danmaku

关于 ass 字幕格式可以参考以下文章:ASS 字幕格式规范

拓展阅读:
Bilibili 视频播放页面接口整理(不定期更新) - 知乎
Bilibili 爬取视频信息进行数据分析

本文更新于 2020 年 12 月 29 日:
增加了关于 BV 号的描述。