欢迎光临散文网 会员登陆 & 注册

ASS字幕格式,随便聊两句

2020-06-15 19:43 作者:暗切线  | 我要投稿

仍然先讲废话:

LVS北京场: https://bj2020.livevideostack.com/speakers/473 ← (就是我了)。由于门票太贵,如果没有爸(公)爸(司)给买(报)票(销),回来看资料就好了,没必要去现场哈(当然,想参加晚宴认识点大神的人除外)反正除了我以外的讲师,都挺🐂*的。

这次的重头大约会放在所谓富媒体展现上,大致包括同步播放媒体、字幕文件、自定义图形渲染、(及其效率、网络和内存控制)。帧级别播放控制之类的。(因为PPT还没做,到时候再看具体内容吧。)

不过今儿先把字幕摘出来说一说。

老实讲,之前做播放器解析了ASS 和 SRT文件。有点惊叹于字幕组的神操作。然后又因为 @只有神知道的歌词特效 前几天的留言,特意去留意了一下字幕特效的东西。

真的是别有洞天啊~~🐂*

言归正传,这次不讲如何做特效。这个 关注 @只有神知道的歌词特效 这位大哥会有收获。今天只说一说字幕格式解析和一些坑点:

  1. 如何判断是个字幕文件:

    我知道你们肯定是看后缀名,但是如果是作为企业级服务,解析后缀名就是纯粹的找死。肯定有人把后缀名改了传东西的。

    这种情况下,一般的文件我们会看MagicNumber。

    啥意思? 就是前N个字节中,特征性的数值。比如FLV文件,判断FLV 开头即可。而MP4,你发现了里面FTYP、MDAT等等 MP4的Box头即可判断。

    而字幕文件会有点麻烦,SRT文件,就并没有这玩意

    需要符合一定的格式规律比如

SRT

数字 回行,时间戳 回行 内容 回行。

ASS稍微好一些:

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指的是啥?

答案:像素格式。

ASS字幕格式,随便聊两句的评论 (共 条)

分享到微博请遵守国家法律