ASS字幕格式,隨便聊兩句

仍然先講廢話:
LVS北京場: https://bj2020.livevideostack.com/speakers/473 ← (就是我了)。由于門票太貴,如果沒有爸(公)爸(司)給買(報)票(銷),回來看資料就好了,沒必要去現(xiàn)場哈(當(dāng)然,想?yún)⒓油硌缯J(rèn)識點大神的人除外)反正除了我以外的講師,都挺??*的。
這次的重頭大約會放在所謂富媒體展現(xiàn)上,大致包括同步播放媒體、字幕文件、自定義圖形渲染、(及其效率、網(wǎng)絡(luò)和內(nèi)存控制)。幀級別播放控制之類的。(因為PPT還沒做,到時候再看具體內(nèi)容吧。)
不過今兒先把字幕摘出來說一說。
老實講,之前做播放器解析了ASS 和 SRT文件。有點驚嘆于字幕組的神操作。然后又因為 @只有神知道的歌詞特效?前幾天的留言,特意去留意了一下字幕特效的東西。
真的是別有洞天啊~~??*

言歸正傳,這次不講如何做特效。這個 關(guān)注?@只有神知道的歌詞特效?這位大哥會有收獲。今天只說一說字幕格式解析和一些坑點:
如何判斷是個字幕文件:
我知道你們肯定是看后綴名,但是如果是作為企業(yè)級服務(wù),解析后綴名就是純粹的找死??隙ㄓ腥税押缶Y名改了傳東西的。
這種情況下,一般的文件我們會看MagicNumber。
啥意思? 就是前N個字節(jié)中,特征性的數(shù)值。比如FLV文件,判斷FLV 開頭即可。而MP4,你發(fā)現(xiàn)了里面FTYP、MDAT等等 MP4的Box頭即可判斷。
而字幕文件會有點麻煩,SRT文件,就并沒有這玩意
需要符合一定的格式規(guī)律比如

數(shù)字 回行,時間戳 回行 內(nèi)容 回行。
ASS稍微好一些:

至少有一些格式標(biāo)準(zhǔn)的頭可以判定 例如?[Script Info]?[V4+ Styles]?[Events] 等
然而這道判斷是在服務(wù)端做的。傳完先矯正一邊文件類型 音頻 視頻 圖片 字幕文件 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
大致是: 先定義了下一些通用信息(標(biāo)題,作者,ASS版本號(一般都4.0了現(xiàn)在))?然后是通用樣式信息,字體,顏色等等?
熟悉前端的同學(xué)可以認(rèn)為是 base.less,或者樣式主題中定義的那些玩意。
最后,Events部分會給出時間線。和展示的內(nèi)容。
這里有個坑點: Timer?
這玩意是定義定時器的。一般都是100%(100.00),但是一些情況下可能出現(xiàn)快速 慢速等情況。
然而寫播放器吧、其實不大在意這個Timer。 需要讀,然后計算出的時間點去乘它。
(音頻、視頻的系統(tǒng)時鐘其實都不太一樣。以后有空給你們寫寫音頻和視頻的定時器,和時間同步問題。字幕文件時間同步問題,其實相對好處理。記得這個Timer參數(shù),別算扯皮了就行了)
3. 時間解析:
賊簡單:?0:00:10.36 =?0 * 60 *60?+ 00 * 60 ?+ 10?+?0.36 就這樣。然后對應(yīng)的就是視頻上的時間點
坑點:這個字幕需要渲染在視頻的那一幀?
很多人認(rèn)為,1 / fps 是每一幀的時間間隔。然后算出來是那一幀即可 也就是 時間 * fps
然而。對于固定幀率的視頻這種說法是對的。非固定幀率的視頻。就不能這么計算了。需要解析封裝格式中的幀的PTS(實際渲染時間)來對應(yīng)。
另外:視頻中還有個東西 很容易被忽略: StartTime或者有的叫BaseTime(對,不一定是0)。指視頻在這個時間點渲染第一幀。并且,后面的所有幀要加上這個時間
常見于直播錄像?;蛘咭曨l截取。因為音頻和視頻時間周期是不一樣的。所以有可能需要音頻播了一下下之后,視頻才開始渲染。就出現(xiàn)了這么個玩意。
4. 特效解析
Effect字段提供的較少。(其實是全局的一些變化,比如卡拉OK效果,滾動效果等等)
真正的特效,一般在Text字段里用大括號括起來
比較有意思的就是這個?\clip 層級 + 繪圖指令。
坑點: 繪圖指令極度類似SVG 但是不是SVG
比如閉合c 而 svg的閉合指令 z
然而算法是一樣的。
所以抽象了一下:
SVG 繪圖指令 和 ASS中的繪圖指令 轉(zhuǎn)換 -> 公司的繪圖數(shù)據(jù)格式(就是老娘定的)->解析 渲染。
為啥會這樣,轉(zhuǎn)成SVG不好嗎?
事實就是: 小程序不支持SVG標(biāo)簽,只能引入SVG文件。就很惡心。。~??
4. 加載控制:
其實字幕文件一般不大,但是ASS支持Base64的圖像。這就有可能讓他變大。。
那么就有可能拖慢視頻的首幀渲染時間(等字幕)
做法也很簡單,流式獲取,獲取到數(shù)據(jù)(不一定獲取完)就開始解析并渲染。
然后就是,加載多少可以開始播。其實沒有特定的時間。一般情況下會比視頻快,所以控制視頻緩存即可。
但是:這又是一個極端情況坑點: 給里面放一堆圖。拿字幕做“視頻”
雖然少見,但是由于視頻有幀間壓縮,而圖片沒有,會比視頻加載還慢。此時。就得控制一下了。就是說。自己定一個緩存值N。當(dāng)前播放時間向后N個Dialogue的全部數(shù)據(jù)加載到緩存中。(真的變態(tài)啊。。)才可以開始播放。卡頓的話,真的沒數(shù)據(jù)再轉(zhuǎn)菊花。
5. 特殊Dialogue
上面提到了圖片,其實還有視頻。額。。
然后,我的做法是,把它抽象成自己定義的多軌文件格式,統(tǒng)一控制。(由于這塊可能10月份的會上重點說,就不提前BB了。)

行吧,先說這么多。
另外,雖然人在北京,但是還沒那么糟糕,一切安好。

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