
圖為:芒果TV CDN研發(fā)總監(jiān)劉維
芒果TV CDN研發(fā)主要負(fù)責(zé)芒果TV點(diǎn)播、直播CDN的建設(shè)。現(xiàn)在主流的直播平臺主要包括互動(dòng)性平臺,對業(yè)務(wù)的要求是低延時(shí)和流暢性,在保障這兩個(gè)前提的基礎(chǔ)上再去強(qiáng)調(diào)清晰度。芒果TV主要有兩大需求方向:一個(gè)是對于電視臺類的傳統(tǒng)節(jié)目類的頻道直播,還有一個(gè)就是大型的活動(dòng)性直播,包括綜藝、晚會(huì)等。
目前直播平臺面臨很多技術(shù)挑戰(zhàn),首先是視頻編碼,264是為了覆蓋兼容性,265各個(gè)平臺基本也都在使用,265主要是為了解決清晰度和節(jié)約帶寬的問題,在音頻上AAC是比較主流的,芒果TV也使用了EAC3,是為了解決多聲道和高品質(zhì)的問題,因?yàn)橄瘛陡枋帧奉惓栊捅荣悓σ纛l的要求比較高,封裝一般主流網(wǎng)站是FLV流和HLS,但是芒果TV多了一個(gè)MPEG-TS,因此負(fù)載比較大,從視頻編碼格式、音頻編碼格式再乘以封裝格式,所輸出的并發(fā)流的路數(shù)非常多,終端覆蓋,基本上移動(dòng)端、網(wǎng)頁端,PC端,芒果TV多一個(gè)重點(diǎn)的就是電視端,電視端帶來的問題,就是它有很多的7×24頻道直播,頻道直播會(huì)對保障要求更過,頻道直播還要求時(shí)移和回看功能,在直播平臺,包括點(diǎn)播功能,從上面來看,整體的技術(shù)需求還是比較復(fù)雜的。
面對這些技術(shù)需求,芒果TV實(shí)行一些關(guān)鍵技術(shù),來解決這些問題,一是高可用網(wǎng)站,還有無縫切流,最后一個(gè)是邊緣同步切片。高可用源站,整個(gè)信號的流程是從信源開始,信源包括衛(wèi)星,主要用衛(wèi)星接收,用網(wǎng)絡(luò)來做備份,不同的信源下面接的是不同的編碼器組,通過組播的方式把信源編碼以后傳遞給下面的分發(fā)源站,分發(fā)源站用組播的方式有一個(gè)好處,就是可以平滑地、無縫地去擴(kuò)容分發(fā)源站,但是這個(gè)好處也帶來一個(gè)問題,分發(fā)源站有很多的服務(wù)器,這些服務(wù)器如何同步地執(zhí)行切換流的指令是目前需要面對的問題。針對這個(gè)問題引入了Redis元數(shù)據(jù)的概念,通過控制所有源站的控制指令,通過后臺對Redis元數(shù)據(jù)控制,實(shí)現(xiàn)所有源站在發(fā)現(xiàn)信源或者是編碼器組故障,或者有業(yè)務(wù)需求要切流的時(shí)候,一致性地推動(dòng)所有的分發(fā)源站做切換動(dòng)作。
接下來是無縫切流,做過CDN的人都有所了解,如果源站出了問題可能會(huì)導(dǎo)致全網(wǎng)故障,所以保障源站的可用性是比較大的問題。源站從信源到編碼器,一直到分發(fā)源站都是多備份的,在多備份的情況下如何平滑地在多備份之間進(jìn)行切換,這就帶來了一個(gè)技術(shù)挑戰(zhàn)。一個(gè)是用戶的體驗(yàn)(流暢性),一個(gè)是競品網(wǎng)站的清晰度,產(chǎn)品和運(yùn)營PK最后的結(jié)論就是讓技術(shù)解決。
編碼器1、編碼器2是相互備份的關(guān)系,提供同樣的清晰度,編碼器1提供三檔清晰度,編碼器2也提供同樣三檔清晰度,源站集群向一級、二級邊緣下發(fā),如果產(chǎn)品要求拼播,會(huì)把第二檔的清晰度作為默認(rèn)清晰度下發(fā),當(dāng)發(fā)現(xiàn)用戶卡頓比較高、流暢性比較差的情況下,把默認(rèn)清晰度動(dòng)態(tài)切換到碼流比較低的狀態(tài),用戶體驗(yàn)可以比較高,編碼器第一組掛了,可以快速地切換到編碼器第二組,用了清晰度3,如果流暢性比較好,嘗試讓用戶切換到更清晰的程度,在同平臺的競爭中我們也有一定的優(yōu)勢。
這是技術(shù)細(xì)節(jié),視頻編碼分三類幀,一類是I幀、關(guān)鍵幀,還有就是B幀,是通過I幀的相對運(yùn)算集散出來的,壓縮比可以達(dá)到50%左右,壓縮效率更高。還有B幀,B幀要通過P幀或者I幀做演算,壓縮率會(huì)更高,因?yàn)闃O度壓縮,里面產(chǎn)生了很多片斷的狀態(tài),有些B幀需要前后幀結(jié)算,所以在切流的時(shí)候,從第一路流切到第二路流,第一路流沒有到關(guān)鍵幀就切的話,前面的幀是解析不了的,所以必須在第一路流的I幀播放完以后馬上切到第二路流,第一套方案上線后出現(xiàn)一些問題,切到第二路流的時(shí)候,只追求了一個(gè)時(shí)效性,非常快速地切過去,但是因?yàn)榫幋a器之間時(shí)效性、準(zhǔn)確性對得不是很齊,會(huì)產(chǎn)生不能解析的問題,因?yàn)樗荘幀,缺少前面的關(guān)鍵幀,所以導(dǎo)致P幀不能解析,甚至B幀也不能解析,所以這塊會(huì)產(chǎn)生一個(gè)花屏,時(shí)間非常短,用戶會(huì)發(fā)現(xiàn)突然花一下,后面等I幀到了以后會(huì)繼續(xù)流暢地往下播。目前芒果TV的改進(jìn)方案就是解決這個(gè)問題。
最后是全網(wǎng)邊緣的同步切片,芒果TV目前封裝方式很多,編碼器到分發(fā)源之間是用RTMT組播,組播之后進(jìn)行封裝,因?yàn)樾枰狧LS格式,如果同時(shí)把這些路往下傳,以后可能還有更多路,剛才說264、265、AAC等等這么多路同時(shí)往下傳的話,會(huì)員帶寬和成本是扛不住的。因此采用一路流直接傳到邊緣,在邊緣做轉(zhuǎn)封裝,這樣的好處是成本可以大幅下降,而且壓力比較輕。
但是碰到邊緣A站看直播流的時(shí)候,突然邊緣A站宕掉或者有什么意外的情況需要重試,通過調(diào)度到邊緣B站,到邊緣B站再獲取同樣時(shí)間點(diǎn)片的時(shí)候,由于每個(gè)邊緣到源站的時(shí)延是不一樣的,包括跳過幾級路由也不一樣,可能經(jīng)過其他中間層的傳輸,所以它到邊緣的時(shí)候時(shí)延是不一樣的,雖然系統(tǒng)時(shí)間一樣,但是流的時(shí)間是不一樣的,中間就產(chǎn)生了差,因?yàn)椴シ牌鞫际怯芯彺娴模シ牌骶彺嫒绻W(wǎng)突然有問題了,拿不到緩存,去后臺做重試,去邊緣B站,去繼續(xù)拿流,但是因?yàn)閮蛇叜a(chǎn)生的內(nèi)容差,就發(fā)現(xiàn)拿流的時(shí)候,會(huì)出現(xiàn)重復(fù)情況,有的時(shí)候時(shí)延情況更嚴(yán)重,給用戶帶來的體驗(yàn)比較差,要解決這個(gè)問題必須在內(nèi)容上去做標(biāo)記,來實(shí)現(xiàn)切片的時(shí)候是內(nèi)容對齊的,所以就考慮了在剛才說的I幀、P幀、B幀中間插一些注示幀、SEI幀,自定義一些信息,把拿到FLV流做封裝的時(shí)候,讀到這些信息的時(shí)候就知道在什么位置做切片,這樣全網(wǎng)所有的切片都是一致的,從A邊緣跳到B邊緣、C邊緣中間都是非常流暢的。