Awesome
B-webmask
B站防挡弹幕蒙版 .webmask 文件格式解压
文件可分为头部和内容两部分 头部格式
name | desc | type | bytes | offset |
---|---|---|---|---|
tag | 文件类型标识符,目前固定为 MASK, 4个字节 | bytes | 4 | 0 |
version | 版本号,目前为 1 | Int32 | 4 | 4 |
check code | 校验码?目前为 2 | Int8 | 1 | 8 |
segments | 所包含段数,每段时间10秒左右, 一个 3 分钟的视频大概会分成 18 段 | Int32 | 4 | 12 |
segments meta | 段的元数据,每段包含 16 个字节, 前 8 个字节表示时间,后 8 个字节表示数据 offset | bytes | 16 * segments | 16 |
B 站 .webmask 文件加载流程:
- 通过 range 头进行分段加载;首先加载前 0-16 字节(理论上只需读取 0-15 前 16 字节即可),校验文件类型
- 校验成功,加载 16-(segments * 16) 字节元数据并进行解析
- 下载后续最多不超过 22 段的数据,通过 pako 进行解压,根据当前视频播放时间从中选择蒙版进行渲染
- 大部分视频不会超过 22 段(22 * 10 / 60 约 3 分钟),超过的话,会按需继续加载后面的数据(每次最多不超过 22 段)
例子: 超过 22 段 // https://www.bilibili.com/video/av21101827
不超过 22 段 // https://www.bilibili.com/video/av46459801