Bilibili弹幕实现本地字幕播放

  • 2016-12-11
  • 1,732
  • 1

因为学校网速原因,导致很多视频都很难看高清的在线视频,就只能下载到电脑看本地视频了,但是这样就没法看弹幕了,所以就萌生了将B站弹幕转换成本地字幕形式播放的想法。

B站的弹幕格式如图:

分别代表着:弹幕出现时间、弹幕类型、字体大小、字体颜色、创建时间、不清楚、创建者ID、弹幕ID。

接下来就是ass字幕的格式了

Dialogue: 1,0:02:02.84,0:02:08.84,Dedualt,,0000,0000,0000,,{\move(1024, 51, -1428, 51)}你以为雷总不上b站了

我们除了需要将原来的时间、颜色、字体大小做改变之外,最难的应该是确实字幕的位置和相应的动作了。

这里讲一下B站的字幕类型:
1. 1代表普通滚动弹幕
2. 4代表底部中间弹幕
3. 5代表顶部中间弹幕

还有其他一些高级弹幕,难度太大就不做处理了。
为了减少弹幕突然集中出现导致的弹幕重叠情况,将弹幕分组储存,分行输出,这样同一时间发出的弹幕可以在多行展示。

这里处理弹幕的算法是:先根据播放器屏幕大小和弹幕字体大小将屏幕分为固定行数,即line = width / fontsize。得到固定行数之后,定义三组数组分别储存三种类型的弹幕,当每组数组内有固定行数个元素之后,也就是当前屏幕所有行数都存在弹幕时,即输出此行数组,并且将当前数组清除准备储存下一组数据,核心代码如下:

接下来就是计算弹幕的位置了,按照ComposeComment函数输出的ROWS,计算出当前弹幕的X轴和Y轴的位置:

核心问题解决后,剩下的就是时间戳、颜色的转换了,很简单就不贴代码了。
最后贴一张效果图:

参考资料:
* Danmaku2ASS
* bilibili弹幕转ass
* ASS格式

链接:https://www.ioiogoo.cn/2016/12/11/bilibili弹幕实现本地字幕播放/
本站所有文章除特殊说明外均为原创,转载请注明出处!