ASS字幕格式,随便聊两句

仍然先讲废话:
LVS北京场: https://bj2020.livevideostack.com/speakers/473 ← (就是我了)。由于门票太贵,如果没有爸(公)爸(司)给买(报)票(销),回来看资料就好了,没必要去现场哈(当然,想参加晚宴认识点大神的人除外)反正除了我以外的讲师,都挺🐂*的。
这次的重头大约会放在所谓富媒体展现上,大致包括同步播放媒体、字幕文件、自定义图形渲染、(及其效率、网络和内存控制)。帧级别播放控制之类的。(因为PPT还没做,到时候再看具体内容吧。)
不过今儿先把字幕摘出来说一说。
老实讲,之前做播放器解析了ASS 和 SRT文件。有点惊叹于字幕组的神操作。然后又因为 @只有神知道的歌词特效 前几天的留言,特意去留意了一下字幕特效的东西。
真的是别有洞天啊~~🐂*

言归正传,这次不讲如何做特效。这个 关注 @只有神知道的歌词特效 这位大哥会有收获。今天只说一说字幕格式解析和一些坑点:
如何判断是个字幕文件:
我知道你们肯定是看后缀名,但是如果是作为企业级服务,解析后缀名就是纯粹的找死。肯定有人把后缀名改了传东西的。
这种情况下,一般的文件我们会看MagicNumber。
啥意思? 就是前N个字节中,特征性的数值。比如FLV文件,判断FLV 开头即可。而MP4,你发现了里面FTYP、MDAT等等 MP4的Box头即可判断。
而字幕文件会有点麻烦,SRT文件,就并没有这玩意
需要符合一定的格式规律比如

数字 回行,时间戳 回行 内容 回行。
ASS稍微好一些:

至少有一些格式标准的头可以判定 例如 [Script Info] [V4+ Styles] [Events] 等
然而这道判断是在服务端做的。传完先矫正一边文件类型 音频 视频 图片 字幕文件 PDF 通过接口返给前端具体类型,按类型解析即可。
2. ASS字幕格式:
其实是 SSA SubStation Alpha 的 升级版 Advanced SubStation Alpha
这就是装个B
至于具体的可以看这篇文章:
https://github.com/weizhenye/ASS/wiki/ASS-%E5%AD%97%E5%B9%95%E6%A0%BC%E5%BC%8F%E8%A7%84%E8%8C%83
大致是: 先定义了下一些通用信息(标题,作者,ASS版本号(一般都4.0了现在)) 然后是通用样式信息,字体,颜色等等
熟悉前端的同学可以认为是 base.less,或者样式主题中定义的那些玩意。
最后,Events部分会给出时间线。和展示的内容。
这里有个坑点: Timer
这玩意是定义定时器的。一般都是100%(100.00),但是一些情况下可能出现快速 慢速等情况。
然而写播放器吧、其实不大在意这个Timer。 需要读,然后计算出的时间点去乘它。
(音频、视频的系统时钟其实都不太一样。以后有空给你们写写音频和视频的定时器,和时间同步问题。字幕文件时间同步问题,其实相对好处理。记得这个Timer参数,别算扯皮了就行了)
3. 时间解析:
贼简单: 0:00:10.36 = 0 * 60 *60 + 00 * 60 + 10 + 0.36 就这样。然后对应的就是视频上的时间点
坑点:这个字幕需要渲染在视频的那一帧?
很多人认为,1 / fps 是每一帧的时间间隔。然后算出来是那一帧即可 也就是 时间 * fps
然而。对于固定帧率的视频这种说法是对的。非固定帧率的视频。就不能这么计算了。需要解析封装格式中的帧的PTS(实际渲染时间)来对应。
另外:视频中还有个东西 很容易被忽略: StartTime或者有的叫BaseTime(对,不一定是0)。指视频在这个时间点渲染第一帧。并且,后面的所有帧要加上这个时间
常见于直播录像。或者视频截取。因为音频和视频时间周期是不一样的。所以有可能需要音频播了一下下之后,视频才开始渲染。就出现了这么个玩意。
4. 特效解析
Effect字段提供的较少。(其实是全局的一些变化,比如卡拉OK效果,滚动效果等等)
真正的特效,一般在Text字段里用大括号括起来
比较有意思的就是这个 \clip 层级 + 绘图指令。
坑点: 绘图指令极度类似SVG 但是不是SVG
比如闭合c 而 svg的闭合指令 z
然而算法是一样的。
所以抽象了一下:
SVG 绘图指令 和 ASS中的绘图指令 转换 -> 公司的绘图数据格式(就是老娘定的)->解析 渲染。
为啥会这样,转成SVG不好吗?
事实就是: 小程序不支持SVG标签,只能引入SVG文件。就很恶心。。~🙄
4. 加载控制:
其实字幕文件一般不大,但是ASS支持Base64的图像。这就有可能让他变大。。
那么就有可能拖慢视频的首帧渲染时间(等字幕)
做法也很简单,流式获取,获取到数据(不一定获取完)就开始解析并渲染。
然后就是,加载多少可以开始播。其实没有特定的时间。一般情况下会比视频快,所以控制视频缓存即可。
但是:这又是一个极端情况坑点: 给里面放一堆图。拿字幕做“视频”
虽然少见,但是由于视频有帧间压缩,而图片没有,会比视频加载还慢。此时。就得控制一下了。就是说。自己定一个缓存值N。当前播放时间向后N个Dialogue的全部数据加载到缓存中。(真的变态啊。。)才可以开始播放。卡顿的话,真的没数据再转菊花。
5. 特殊Dialogue
上面提到了图片,其实还有视频。额。。
然后,我的做法是,把它抽象成自己定义的多轨文件格式,统一控制。(由于这块可能10月份的会上重点说,就不提前BB了。)

行吧,先说这么多。
另外,虽然人在北京,但是还没那么糟糕,一切安好。

交流群:711929228
本期问题:yuv420p指的是啥?
答案:像素格式。