本工具主要解决部分已经下架的视频的弹幕播放问题,转为ass字幕后可以使用任意支持字幕的播放器播放。
具体获取A站、B站弹幕的方法请自行搜索,B站可考虑使用BiliPlus或哔哩哔哩唧唧
感谢tiansh/us-danmaku提供诸多指导。
由于本工具使用了node-canvas
进行字符长度的计算,而需要计算汉字的宽度,需要安装pango
库,因此先参考node-canvas的安装说明进行安装。macOS除正常的依赖外,请额外安装pango
库:
brew install pango
之后使用npm进行安装:
npm install -g danmaku-to-ass
danmaku [参数] [文件列表]
默认输入为.xml
文件时解析为B站弹幕,为.json
文件(尚未实现)时解析为A站弹幕。
也可以提供一个由本工具生成的.ass
文件(必须以--inlude-raw=true
参数生成),以达到调整生成参数的目的,如以下命令可以将字号变小并覆盖原字幕文件:
danmaku --font-size=12,18,24 --out-dir=./subtitle ./subtitle
当然也可以使用--out
参数单独处理一个文件,或指定不同的--out-dir
保留旧文件。
--out {输出文件}
:使用该参数时将输出保存至参数指定的文件,与--out-dir
二选一。--out-dir {输出目录}
:使用该参数可以将多个文件进行批量转换并保存到指定的目录下,如果使用该参数则不要使用--out
参数。
--config
:指定一个配置文件,格式见后文,指定该参数后其它配置参数都会失效。--font-size
:指定字号列表,必须是3个从小到大的数字并用逗号连接,比如18,25,36
。--font-name
:指定字体名称。--color
:指定默认弹幕颜色,可以使用ff3300
、#fc9730
、#fff
、000
这几种格式。--outline-color
:指定边框颜色。--back-color
:指定阴影颜色。--outline
:边框的像素宽度。--shadow
:阴影的像素深度。--bold
:指定是否使用粗体,值为true
时表示使用粗体。--opacity:
指定字体的透明度,必须是0-1之间的小数。--padding:
指定每条弹幕四周的空白,必须是4个数字并用逗号连接,比如2,2,2,2
。--play-res-x
:视频播放区域的宽度。--play-res-y
:视频播放区域的高度,这个参数与宽度共同决定视频的长宽比例,具体数值不是很重要。--scroll-time
:滚动弹幕的持续时间,单位为秒。--fix-time
:固定弹幕(上方或下方)的持续时间,单位为秒。--bottom-space
:底部留空的区域大小,以防止弹幕覆盖原始字幕。--include-raw
:是否在生成的文件中保留原始信息,保留原始信息可以在后期重新使用本工具修改弹幕生成的参数,但会导致文件变大约1/3。该参数默认值为true
,可提供false
强制不保留原始信息。--merge-in
:指定n秒内出现相同弹幕合并为一条,参数值为一个数字,以秒为单位。--block
:提供正则来屏蔽弹幕,可以多次使用该参数,每次提供一个正则或内置规则。--block-file
:提供一个文件来屏蔽弹幕,文件中的每一行都是一个正则或内置规则,如果这个参数与--block
一起出现,两者会被合并。这个参数在配置文件中无效。
在使用--block
或--block-file
时,每一个屏蔽规则都是一个正则表达式或一个内置规则,比如:
.{4,}
呵呵
则表示屏幕所有长度大于4的弹幕以及包含关键字“呵呵”的弹幕。除此之外也可以使用以下内置规则:
COLOR
:屏蔽所有彩色弹幕。TOP
:屏蔽所有顶部弹幕。BOTTOM
:屏幕所有底部弹幕。
需要注意的是,从已有的.ass
文件生成新的字幕时,原有的屏蔽规则会失效,所有屏蔽规则均以此次执行命令的配置为准。
以下除fontName
名均为默认值。
{
"fontSize": [25, 36],
"fontName": "黑体",
"color": "#ffffff",
"outlineColor": null,
"backColor": null,
"outline": 2,
"shadow": 0,
"bold": false,
"padding": [2, 2, 2, 2],
"playResX": 1280,
"playResY": 720,
"scrollTime": 8,
"fixTime": 4,
"opacity": 0.6,
"bottomSpace": 60,
"block": [],
"includeRaw": true
}
同样可以使用程序进行调用:
import convert from 'danmaku-to-ass';
import {readFileSync} from 'fs';
let text = readFileSync('av12345.xml', 'utf-8');
let ass = convert(text, {}, {source: 'bilibili', filename: 'av12345.xml'});
函数签名:
{string} convert({string} text, {Object} configOverrides, {Object} context);
参数说明:
text
:弹幕文件内容,如果是Bilibili则为XML文本,Acfun为JSON文本。configOverrides
:覆盖默认配置的内容,见上文的配置文件参考。context
:转换的上下文信息,需要2个属性:{string} source
:内容的来源类型,为"bilibili"
或"acfun"
(注意全小写)。{string} filename
:来源文件名,如果没有的话可以随便写一个,主要放在ass文件的信息部分。