高清視頻下如何節(jié)省帶寬?
數(shù)據(jù)顯示,國內(nèi)互聯(lián)網(wǎng)流量每月被消耗 200EB,且 80% 的流量消耗來自于視頻領(lǐng)域。隨著 5G 的普及,云制播等得到快速發(fā)展,流量消耗會越來越大,而這背后是非常高昂的帶寬成本。如何通過技術(shù)創(chuàng)新,讓用戶流暢看高清的同時,實現(xiàn)平均帶寬成本的持續(xù)下降?本文為阿里文娛技術(shù)專家七甲的分享,將詳解介紹文娛在云邊端內(nèi)容分發(fā)領(lǐng)域的最新探索,希望對音視頻、泛內(nèi)容分發(fā)領(lǐng)域的技術(shù)同學(xué)有所啟發(fā)。
一 節(jié)省帶寬成本的技術(shù)挑戰(zhàn)
從實際業(yè)務(wù)場景出發(fā),節(jié)省帶寬成本這個命題,在技術(shù)上面臨非常多的挑戰(zhàn)。
第一,優(yōu)酷服務(wù)的終端類型多,移動端有 Android,IPhone,IPad;PC 端有 Window 和 MAC,還有 Web 端,OTT 端等等。不同終端有不同特性,在處理機制上就會不同。即使同一類終端,針對特殊機型也需要做專門適配。
?? 
第二,視頻業(yè)務(wù)的種類多。像直播業(yè)務(wù),點播業(yè)務(wù),緩存下載業(yè)務(wù),短視頻業(yè)務(wù),每種業(yè)務(wù)所關(guān)注的指標(biāo)都不相同,比如點播會關(guān)注播放是否流暢;直播還關(guān)注時延;緩存下載主要關(guān)注下載的速度。
第三,應(yīng)用場景的多樣化。即使同一業(yè)務(wù),也有很多細(xì)分場景,處理策略也存在差異。比如直播和點播有智能檔,緩存下載有邊下邊播,點播有倍速播放。不同的網(wǎng)絡(luò)類型,在處理上也會有所區(qū)別。
第四,視頻多,長尾視頻更多。
- 優(yōu)酷有海量的資源,而邊緣節(jié)點的存儲是有限的,并不能所有資源都存,需要從中找最熱的資源存儲。
- 視頻格式多,不同的清晰度,會導(dǎo)致供源節(jié)點被稀釋掉,導(dǎo)致供給不足。
- 顯著的長尾特征,大部分視頻的單日的播放量少,也需要處理方案。
二 技術(shù)策略:云邊端內(nèi)容分發(fā)網(wǎng)絡(luò)
云邊端內(nèi)容分發(fā)網(wǎng)絡(luò),簡稱 PCDN,它是以 P2P 技術(shù)為基礎(chǔ),通過挖掘海量的碎片化的閑置資源,構(gòu)建高品質(zhì)低成本的內(nèi)容分發(fā)網(wǎng)絡(luò)系統(tǒng)。
?? 
PCDN 是一個三級網(wǎng)絡(luò)加速體系:
- 一級是云,也就是 CDN。
- 二級是邊緣網(wǎng)絡(luò),包括邊緣節(jié)點,路由設(shè)備,商業(yè) WiFi 等。這些節(jié)點不會直接參與消費,主要是作為供源節(jié)點,為其它節(jié)點提供上行。
- 三級是終端設(shè)備,這些設(shè)備是流量的主要消費者,其中一小部分能力強的節(jié)點,也可以為其它設(shè)備供源。
- 當(dāng)有設(shè)備播放視頻時,PCDN 網(wǎng)絡(luò)就可以提供視頻加速,保證視頻穩(wěn)定流暢的播放;通過合理地切換從不同節(jié)點的下載,讓成本降到最低。
從 PCDN 系統(tǒng)架構(gòu)可以看出,云邊端內(nèi)容分發(fā)網(wǎng)絡(luò)分為三級網(wǎng)絡(luò),涵蓋十多類節(jié)點,每類節(jié)點的上行能力,帶寬成本,存儲能力都各不相同。下面我們從帶寬成本,上行能力,存儲大小,節(jié)點規(guī)模,資源定位這五方面,對比一二三級各類節(jié)點的能力和特征,最后給每類節(jié)點做出定位。
?? 
一級節(jié)點的上傳能力強、服務(wù)穩(wěn)定,但帶寬成本很高,所以用它來下載必要的,緊急的數(shù)據(jù)。
二級節(jié)點的上傳能力比一級稍差,但 24 小時在線,能提供較穩(wěn)定的服務(wù),在某些條件下,可用來代替一級使用。
三級節(jié)點的上傳能力弱,存儲又小,也不能保證穩(wěn)定在線。優(yōu)勢就是規(guī)模大,成本低。可以通過多點下載,就近下載,將成本大幅的降低。
所以,根據(jù)三種節(jié)點特征,揚長避短,最大化的利用每一類節(jié)點的優(yōu)勢。比如,三級節(jié)點存儲小,要最大化利用它的上行帶寬,緩存頭部非常熱的資源。二級節(jié)點存儲大,能夠穩(wěn)定供源,可以存儲中熱和長尾的視頻。 三 PCDN 底層基石:P2P 的基本原理
云邊端內(nèi)容分發(fā)網(wǎng)絡(luò),底層用到 P2P 網(wǎng)絡(luò)技術(shù),這張圖是一個簡單點的 P2P 模型:
?? 
節(jié)點 A 和節(jié)點 B 都看了《冰糖燉雪梨》的第 12 集,節(jié)點 A 先看的,觀看后本地會存有一部分?jǐn)?shù)據(jù),當(dāng)節(jié)點 B 在觀看的時候,可以直接從節(jié)點 A,通過點對點數(shù)據(jù)傳輸?shù)姆绞较螺d數(shù)據(jù),不需要所有數(shù)據(jù)都從 CDN 下載。 在整個數(shù)據(jù)的分享過程,可以拆分成資源緩存、節(jié)點分配、下載調(diào)度和數(shù)據(jù)分享四個關(guān)鍵環(huán)節(jié)。
?? 
1 資源存儲
第一個環(huán)節(jié),資源存儲。在這個環(huán)節(jié)中做了三事情:
- 如何標(biāo)識一個資源?
- 將各類資源歸一化,切成一個個固定大小的分片。
- 決定哪些資源該存,哪些資源不該存?
資源標(biāo)識
要標(biāo)識一個資源,大家首先會想到的是 URL,但 URL 太長,在交互過程中不方便,并且會增加傳輸帶寬的損耗;另外,URL 中的很多可變元素,比如時間戳,鑒權(quán)信息等干擾信息必須去掉,否則會導(dǎo)致同一個視頻生成不同的資源 ID,不能相互分享。
優(yōu)酷有一套資源 ID 的生成算法,會根據(jù) URL 關(guān)鍵特征信息,生成全局唯一的資源 ID,且長度小于 URL 長度,便于交互。
資源分組
第一,優(yōu)酷有海量的視頻資源,有的文件很大,一旦超出緩存上限,就無法在本地緩存整個資源,無法做 P2P 分享,所以說要做切分。
第二,不同的視頻格式,比如 HLS 格式,會先請求一個 TS 索引文件,再依次請求每一個 ts。不同的視頻格式如果單獨處理,邏輯復(fù)雜度,且維護(hù)成本非常高。所以我們會在下載入口將視頻資源做分組,歸一成固定大小的文件,統(tǒng)一下載內(nèi)核,簡化邏輯,減少維護(hù)成本。
第三,有助于提高分享效率。前面講 P2P 原理,節(jié)點 A 無需等整個視頻看完,前面的數(shù)據(jù)就可以分享。如果以整個視頻為單位進(jìn)行分享,必須等整個視頻數(shù)據(jù)下載完成,效率就會非常低。
第四,提高緩存利用率。一個基本常識,如果將視頻按時間切分,每個時間點的播放數(shù)并不相同。例如片頭片尾,觀看的人非常少;另外,細(xì)心的同學(xué)會留意到,在進(jìn)度條上方有很多劇情提示,精彩劇情會被反復(fù)觀看。特別在綜藝節(jié)目中,當(dāng)某位明星出現(xiàn)時,觀看的次數(shù)會明顯增多。而對不精彩的劇情呢,很多人會拖拽視頻,跳過去播放。所以,在切片之后,我們可以對播放量多的視頻多存儲,對于播放量少的視頻少存儲,從而提高整體的資源利用率和 P2P 分享率。
資源存儲
消費端在每個分片下載時,都會從服務(wù)端請求這個分片對應(yīng)的節(jié)點列表,服務(wù)端就可以根據(jù)這個分片被請求的次數(shù),來推算出大致的播放量。并且服務(wù)端有所有資源的被訪問記錄,就可以判斷哪些分片是熱門的,哪些是冷門的。邊緣節(jié)點在和服務(wù)端交互時拿到這個信息,來決定哪些資源該存,哪些不該存。
?? 
2 節(jié)點分配
第二個環(huán)節(jié),是節(jié)點分配。在這個環(huán)節(jié)中包括節(jié)點篩選,節(jié)點調(diào)度和智能分配。
節(jié)點篩選
第一個是根據(jù) NAT 類型過濾。所謂的 NAT 就是地址映射,是為了解決 IPv4 地址短缺的問題而引入的。大部分家庭網(wǎng)絡(luò)終端設(shè)備都是在路由下面,實際分配的是一個內(nèi)網(wǎng) IP 地址,訪問外網(wǎng)會通過 NAT 映射出一個公網(wǎng) IP 和端口,我們常見的 NAT 類型有四種:全錐形、地址受限型、端口受限型和對稱型。其中“對稱型和對稱型節(jié)點”之前、“對稱型和端口受限型節(jié)點”之間的連通性是非常差的。所以,我們會根據(jù) NAT 類型,將無法連通的節(jié)點過濾掉,提供返回的有效節(jié)點比例。
第二個是節(jié)點質(zhì)量過濾。在大規(guī)模的節(jié)點網(wǎng)絡(luò)中,節(jié)點能力參差不齊,如果優(yōu)質(zhì)節(jié)點和質(zhì)量差的節(jié)點混合在一起,就會增加端側(cè)節(jié)點質(zhì)量評估的成本。因此需要過濾掉質(zhì)量差的節(jié)點,提高返回節(jié)點的整體質(zhì)量。
節(jié)點調(diào)度
第一個是就近原則。在距離維度上將節(jié)點劃分成 5 個范圍,范圍從小到大,依次是:鄰近節(jié)點,本市,本省,本大區(qū),全國。其中鄰近節(jié)點主要,指同一個社區(qū),企業(yè),校園等。從數(shù)據(jù)上看,距離越近,速度越快,延遲會更低。
第二個是能力匹配原則。打個比方,節(jié)點 A 的上行能力是節(jié)點 B 的兩倍,那么在分配次數(shù)上,按 2:1 的比例分配節(jié)點,這樣就能將 A 和 B 節(jié)點的上行能力最大化的發(fā)揮出來。否則如果按 1:1 的比例分配,可能會出現(xiàn),A 的上行跑不滿,而節(jié)點 B 的負(fù)載過高等問題。
智能分配
前面的篩選和調(diào)度,主要是針對供給側(cè)節(jié)點信息的。而動態(tài)分配主要是針對消費側(cè)的信息的,就是消費節(jié)點在請求節(jié)點的時候,會上報一些當(dāng)前請求的信息,動態(tài)計算出需要返回的節(jié)點個數(shù),以及不同節(jié)點的比例。
第一個是清晰度,清晰度越高,需要的節(jié)點個數(shù)越多。
第二個是 buffer 水位,當(dāng) buffer 水位較低時,多分配一些高質(zhì)量的節(jié)點,提高下載速度;當(dāng) buffer 水位較高時,多分配一些低成本的節(jié)點,降低帶寬成本。
第三個是,不同的節(jié)點按一定的比例返回,保證每一種節(jié)點都能分配到,同時也給端側(cè)一些決策空間。
3 下載調(diào)度
第三個環(huán)節(jié),是下載調(diào)度。在這個環(huán)節(jié)中包括調(diào)度策略,節(jié)點管理和任務(wù)分配。
調(diào)度策略
在左邊這個圖形中,下面這個是播放進(jìn)度條。這個點所在的位置就是播放點,播放點左邊的數(shù)據(jù),是已經(jīng)播完的數(shù)據(jù),是藍(lán)色的線,播放點右邊灰色的這段區(qū)間是本地有緩存數(shù)據(jù)的區(qū)間,再往右這段,是將要下載的數(shù)據(jù)區(qū)間,這個點也叫下載點。
?? 
在下載調(diào)度上,我們的基本原則是:體驗優(yōu)先,兼顧成本。
根據(jù)播放點后面,buffer 水位的高低,可以劃分成幾個區(qū)間,紅色這個區(qū)間,是緊急區(qū),說明當(dāng)前的 buffer 數(shù)據(jù)比較少,如果不及時補充數(shù)據(jù),可能會影響播放體驗,這個區(qū)間內(nèi)主要是從 CDN 節(jié)點下載,快速填滿 buffer;中間這個區(qū)間是過渡區(qū),buffer 數(shù)據(jù)沒有那么緊急了,可以讓一部分?jǐn)?shù)據(jù)從二三級下載,如果,buffer 水位降低,可以繼續(xù)用一級下,如果 buffer 水位升高,則可以用二三級接管下載。最右邊的區(qū)間是安全區(qū),可以全都走二級和三級下載。當(dāng)然,這里面會有很多細(xì)節(jié)的策略,比如這兩條水位線,并不是固定不變的,而會根據(jù)歷史卡頓情況,當(dāng)前網(wǎng)絡(luò)質(zhì)量,P2P 節(jié)點數(shù)和下載速度等,實時決策,動態(tài)調(diào)整的。
節(jié)點管理
首先是節(jié)點獲取,這里為了節(jié)省和服務(wù)端交互的損耗,在上一個分片沒下完的時候,可以提前獲取下一個分片的節(jié)點,并且提前建立好一部分連接,等當(dāng)前分片開始下載的時候,就可以直接發(fā)送任務(wù)請求。在每個節(jié)點的下載過程中,會根據(jù)節(jié)點的首包時間,下載速度,任務(wù)完成數(shù)量和質(zhì)量等信息,給節(jié)點打分。最后任務(wù)會逐步收斂到質(zhì)量好的節(jié)點上,而質(zhì)量差的節(jié)點,就會被逐步淘汰掉。 任務(wù)分配
這里面我們遵循多勞多得的方式,給下載速度快,完成質(zhì)量好的節(jié)點,優(yōu)先分配任務(wù)和分配更多的任務(wù)。同時,會監(jiān)測每個節(jié)點當(dāng)前的下載速度,RTT,提前預(yù)判后面的數(shù)據(jù),是否會超時,如果預(yù)判會超時,就會提前回收任務(wù),再分配給其他節(jié)點,而不會死等改任務(wù)超時。
?? 
4 數(shù)據(jù)分享
第四個環(huán)節(jié),是數(shù)據(jù)分享。數(shù)據(jù)分享的過程,其實就是兩個節(jié)點之間建立連接,發(fā)送任務(wù)請求,供給端收到后,如果本地有數(shù)據(jù),就會返回實際數(shù)據(jù)。最后在消費端會統(tǒng)一對數(shù)據(jù)數(shù)據(jù)做校驗,判斷是否被篡改,確保數(shù)據(jù)的一致性,這么一個過程。
節(jié)點連接
這里面重點講一下節(jié)點之間的連接,這里說的連接主要指節(jié)點間的建立一種連通性,互相發(fā)包,對方能收到。節(jié)點間的連接主要有三種方式,有直連,反連和打洞三種方式,直連主要是用在對端是公網(wǎng)節(jié)點,可直接訪問的,比如大部分邊緣節(jié)點都在公網(wǎng)上,終端設(shè)備可以通過直連的方式訪問;反連主要是用在,己方在公網(wǎng),可以直接被訪問,對端在 NAT 后面,這時候可以向?qū)Ψ降?Relay 發(fā)一個反連請求,由對端的 Relay 轉(zhuǎn)發(fā)給這個節(jié)點,再由對端發(fā)起向自己的直連,這種在己方在公網(wǎng)上,或者是全錐地址類型的時候,可以用。最后是打洞,這種方式,常用在兩個節(jié)點都在 NAT 后面。
數(shù)據(jù)傳輸
節(jié)點連通之后,主要就是協(xié)議交互和數(shù)據(jù)傳輸,這里我們也自研了一種可靠的 UDP 傳輸方式,同時優(yōu)化了里面的擁塞控制算法,增加快速啟動,丟包預(yù)判,快速重傳等機制,讓傳輸更加的高效。 數(shù)據(jù)校驗
數(shù)據(jù)校驗是為了保證數(shù)據(jù)的一致性。在 P2P 網(wǎng)絡(luò)中,如果有臟數(shù)據(jù)是非常致命的,因為它會一傳十,十傳百,快速擴散到整個網(wǎng)絡(luò)中,污染整個網(wǎng)絡(luò)數(shù)據(jù)。針對此,我們也有一套非常完備的方案,從磁盤存儲,上傳鏈路,網(wǎng)絡(luò)傳輸,下載鏈路等各環(huán)節(jié)都增加了校驗機制。
常見的校驗方法主要有 MD5,CRC 等。MD5 的安全性高,但性能開銷大,Crc 的安全性較弱,但性能開銷少。我們也采用了 MD5+Crc 相結(jié)合的技術(shù)方案,對關(guān)鍵數(shù)據(jù)做 MD5 校驗,對非關(guān)鍵數(shù)據(jù)做 crc 校驗,即保證數(shù)據(jù)一致性,又能最大化降低性能損耗。
?? 
通常情況下,劇集的熱度越高,越節(jié)省成本。因為熱劇的播放量大,供源節(jié)點多,分享效果好。但是,新片源并不適用這個規(guī)律。因為資源緩存需要一個時間窗口,很多熱劇熱綜都會選擇在晚間整點發(fā)布,用戶也會在發(fā)布的第一時間觀看,而新發(fā)布的片源在短時間內(nèi),并沒有那么多供源節(jié)點。在這一時間窗口內(nèi),供需非常不平衡,P2P 分享率也比較低。
針對此,我們采用了智能預(yù)推和快速回源方案。所謂智能預(yù)推,是綜合前幾集的播放量,同類視頻播放量的變化曲線,以及地區(qū),運營商,清晰度等維度的播放信息,計算出需要往哪些地區(qū)的邊緣節(jié)點,推送多少副本數(shù),在新片上線前,提前推送下去。
所謂快速回源,主要是針對不容易預(yù)測的,短時間內(nèi)訪問量突然增加的資源,通過回源到邊緣節(jié)點,讓邊緣節(jié)點快速下載整個視頻,對之后再觀看視頻的節(jié)點進(jìn)行加速。
通過這兩個方法,熱門劇集上線時,就不用擔(dān)心沒有供源節(jié)點,或者供源節(jié)點不足,導(dǎo)致分享率低。
?? 
大型直播主要指大型活動、體育賽事直播,比如像雙11 貓晚、春晚,國慶閱兵直播、世界杯直播等。 直播和點播的場景差異較大,挑戰(zhàn)也比點播大,主要表現(xiàn)在幾個方面:
- 首先是低延時。為了減少直播時延,在直播場景中實時能拿到的數(shù)據(jù)量非常有限,并且大家的播放點都是接近的,可供分享的數(shù)據(jù)非常少,所以會導(dǎo)致整體的供源節(jié)點不足。
- 其次是 buffer 水位低。因為數(shù)據(jù)量有限,一般只能拿到 2-3 個 ts,時長只有幾秒到十幾秒,這對調(diào)度的要求非常高。前面提到的點播的緊急區(qū)水位,在幾十秒用來抗網(wǎng)絡(luò)抖動,但是直播不會有那么多 buffer。所以如果調(diào)度策略不合理就很容易造成卡頓。但前面讓出的 buffer 水位過多,又會減少 P2P 分享。
- 第三是高動態(tài)。對于點播來說,只要這個設(shè)備已經(jīng)緩存了該資源,那么不需要用戶在線看這個視頻,也可以對外分享,和用戶行為無關(guān)。但是,直播場景并不是這樣的,在直播場景中一旦退出直播間,這路流的數(shù)據(jù)就斷了,就不能再為其它節(jié)點供源。而在直播過程中,進(jìn)出直播間是很常見的。
為了提高直播整體的分享率效率,這里我們重點引入了邊緣節(jié)點。一是將邊緣節(jié)點作為供給,邊緣節(jié)點的服務(wù)相對是比較穩(wěn)定的;其次,是邊緣節(jié)點在數(shù)據(jù)內(nèi)容的更新上,會和 CDN 保持高度同步,在大部分情況下用來代替一級。
四 實戰(zhàn)經(jīng)驗分享
對于大型復(fù)雜的網(wǎng)絡(luò)系統(tǒng),需要學(xué)會從點線面體不同的視角去看系統(tǒng),從大到小,層層深入,同時又能夠跳出系統(tǒng),看到系統(tǒng)整體的內(nèi)外部環(huán)境,上下游交互。總體上,需要去理解整體系統(tǒng)的業(yè)務(wù)模式和運作原理。在面上,需要去熟悉系統(tǒng)各個面的劃分和交互,比如 PCDN 里面就包含了調(diào)度面,管控面,業(yè)務(wù)面,基礎(chǔ)服務(wù)等等。在線上,需要去拆解每個面上的基礎(chǔ)功能模塊,以及不同層級的劃分,比如業(yè)務(wù)面上,有上傳,下載,發(fā)布等等。在點上,需要深入了解每個技術(shù)點,算法策略等等。
首先,面對一個復(fù)雜的網(wǎng)絡(luò)系統(tǒng),第一步要做的就是拆解。將一個系統(tǒng),拆分成幾個子系統(tǒng),明確每個子系統(tǒng)的職能,輸入是什么,輸出是什么。當(dāng)然,光拆解還不夠,要對每個子系統(tǒng)定義出指標(biāo),用來反應(yīng)系統(tǒng)的優(yōu)劣,并將所有的指標(biāo)通過數(shù)據(jù)和報表展示出來。這樣就能看到整個系統(tǒng)的全貌,以及哪里有瓶頸。
?? 
其次,技術(shù)一定要與業(yè)務(wù)深度融合,才能發(fā)揮最大價值。例如,前文提到的倍速播放,如果在下載調(diào)度決策時,不能準(zhǔn)確獲取播放的倍速信息,就可能誤判,導(dǎo)致原來需要從 CDN 下載的時候,沒有去下載,造成卡頓。 最后,建模和快速迭代。在整個 PCDN 網(wǎng)絡(luò)系統(tǒng)中,有很多的場景和功能都可以抽象成日常生活中的模型,例如下載調(diào)度算就像一個蓄水池模型,節(jié)點調(diào)度其實是一個供需模型等等。當(dāng)建立好模型后,還需要及時的反饋,這其中有很多方式,可以通過壓測,用大量樣本去訓(xùn)練,還有分桶驗證等其他方式,通過這些方式去判斷模型的優(yōu)劣,以及找到模型當(dāng)中各參數(shù)的最優(yōu)解。






















