Closed Genteure closed 1 year ago
关于存储的数据,根据目前各个处理弹幕文件的repo的issue来看
以上三个是当前录播姬会输出的内容。剩下的就是(嘴炮)想法了,毕竟没有认真了解:弹幕的位置,就比如说是上下固定,还是左右移动的。
对于格式……其实我对于xml了解不多。现在貌似,比如说vscode,是喜欢用json来存数据的(为什么说这个呢,因为repo主说在用python重构,而python解析json那是相当的爽),存储各种数据都方便,而且增减字段影响不大……不过要考虑到文件大小的话,这个我没有把握说它就一定会比xml好多少。
感谢 Genteure 大大无比优秀的软件给大家带来了诸多便利!(手动打call)
在我看来,既然都录了几个 GiB 的视频文件了,还需要在乎几十上百 MiB 的弹幕数据大小吗?
当然目前的 XML 格式保存弹幕原始数据确实有一点不妥之处。
个人认为,兼容 B 站的弹幕就是 XML 格式存在的唯一优点。有人说,文件格式要么被设计成对机器友好、要么被设计成对人类友好,而 XML 格式两者都不占。那么用 XML 格式应该怎么存储弹幕数据呢?B 站已经给出了答案——
<d p="29.922,1,25,16777215,1595726203,0,a39f0744,36441903090630661">啊这。。。</d>
将 Danmaku
简化为 d
,其他字段的值全部放进 property
简化后的 p
属性中——这样通过去掉所有的语义信息及空格做到了极致的压缩,使得 XML 格式弹幕文件为最小。也许这才是 XML 文件存储弹幕数据的正确方式。
目前通过 DanmakuFactory 转换生成的 ASS 文件大小大约是记录了原始数据的 XML 文件大小的 20%。对于开发者来说文件大小是无所谓,但对于使用者可能就比较敏感,毕竟自己只想要要 p
属性中的数据,又何必拖家带口地背负 raw
属性的累赘呢?如此想来,如果是导出为 XML 格式,那么数据内容必然只与 B 站主站的弹幕数据一致。
如果想用新的文件格式保存弹幕数据,为满足不同的要求,个人认为不至于造个新的格式(增加使用者的负担),在已有的格式中按用途选取即可。比如原始数据保留为 JSON,有 XML 使用需求的再自动导出大幅缩减的 XML 格式,若不想占用太大空间,那么可以将原始数据保存为 SQLite(当然也不至于为节省汉字存储空间而将 UTF-8 编码改为 GB18030 编码),它既方便数据字段的扩展也方便导出为 JSON、XML 等其他格式的文件。
综上所述,个人愚见:
{
"background_bottom_color": "#E2B52B",
"background_color": "#FFF1C5",
"gift": {
"gift_name": "醒目留言",
"num": 1
},
"message": "统一冰红茶,真柠檬,真青春!",
"message_font_color": "#72110E",
"price": 100,
"rate": 1000,
"time": 300,
"ts": 1690032220,
"uid": 99452737,
"user_info": {
"uname": "miaomiaomiao来啦",
"user_level": 10
}
}
展开存储为
<sc uid="99452737" ts="1690032220" time="300" rate="1000", price="100" message_font_color="#72110E" message="统一冰红茶,真柠檬,真青春!" background_color="#FFF1C5" background_bottom_color="#E2B52B">
<user_info user_level="10" uname="miaomiaomiao来啦" />
<gift num="1" gift_name="醒目留言" />
</sc>
(改得我有点恶心)由于数据格式进行了修改,许多依照以前格式解析的工具可能也要进行相应的改动。
暂时考虑这么多,非常感谢 Genteure 大大在软件功能上的开发工作!
大大好,上面两位大佬的方案我觉得已经是很完美了~
最近也和其他人在各种群里有一些讨论,暂定的是用 JSONL 作为文件格式,即每行一个 JSON 文本。可能会选一个自定义的文件后缀(而不是直接 .jsonl
)。
也有人提出用 CBOR,如果后续觉得有需要的话也可以作为另外一个选项,数据结构和 JSONL 的保持一致即可。
讨论后感觉使用文本格式、保持“记事本可读性”还是挺重要的一个点。要数据密度的话可能流式 gzip 输出成 弹幕.xxx.gz
文件更合理一些。不过之前录播姬导出的 FLV 数据文件出现过 gz 文件无法正常解压的情况,等实际实现的时候还需要多测试测试。
我目前考虑的是每个弹幕都记录发送的绝对时间,比如 unix 时间戳。在文件最后记录参照时间点,弹幕的时间减去参照时间点就是弹幕在视频中应该出现的时间。主要是方便对齐弹幕和视频内容,因为弹幕写入到文件的时候可能还不能确定与视频的时间关系,需要事后再计算。如果在内存中缓存弹幕数据等到得出结论再写入,又有可能使用过多的内存。
更新:现在B站直播的弹幕连接加了风控,弹幕数据不全也不可靠了,设计新格式这个事应该就不做了。。
Originally posted by @hihkm in https://github.com/hihkm/DanmakuFactory/issues/64#issuecomment-1664284048
我一直想给录播姬设计一个新的弹幕文件格式,主要想解决现有格式的一些问题:
现在格式的优点:
一直以来录播姬输出的弹幕文件很大一部分用户都是直接喂给 DanmakuFactory 转成
.ass
文件了,所以我在考虑现在格式的优点并不是特别重要。并且之后如果设计了一个新的文件格式,可以写个工具转换成原来的 XML 格式。问题/讨论点:
如果设计一个新的弹幕文件格式,里面保存哪些数据?具体使用什么格式比较好?
我自己目前的考虑: