一蹂季、概述
目前冕广,移動(dòng)視頻直播正處于一個(gè)高速膨脹的時(shí)期。游戲直播偿洁,秀場(chǎng)直播等APP鋪天蓋地撒汉。如何在千軍萬(wàn)馬中脫穎而出,直播的實(shí)時(shí)性和流暢性是重中之重涕滋。
直播的實(shí)時(shí)性對(duì)于用戶體驗(yàn)非常重要睬辐,主要體現(xiàn)在兩個(gè)方面:秒開(kāi)和延時(shí)。秒開(kāi)是指用戶點(diǎn)擊播放到看到畫面的時(shí)間非常短,在1秒之內(nèi)溯饵;延時(shí)是指播放端的畫面和主播端的畫面的時(shí)間差侵俗,時(shí)間差越小,實(shí)時(shí)性越好丰刊,體驗(yàn)越佳隘谣。
保證直播的流暢性是指在直播過(guò)程中保證播放不發(fā)生卡頓,卡頓是指在播放過(guò)程中聲音和畫面出現(xiàn)停滯啄巧,非常影響用戶體驗(yàn)寻歧。造成卡頓的原因有幾種情況:(1)推流端網(wǎng)絡(luò)抖動(dòng)導(dǎo)致數(shù)據(jù)無(wú)法發(fā)送到服務(wù)器,造成播放端卡頓棵帽;
(2)播放端網(wǎng)絡(luò)抖動(dòng)導(dǎo)致數(shù)據(jù)累積在服務(wù)器上拉不下來(lái)熄求,造成播放卡頓渣玲。
由于從服務(wù)器到播放器的網(wǎng)絡(luò)情況復(fù)雜逗概,尤其是在3G和帶寬較差的WIFI
環(huán)境下,抖動(dòng)和延遲經(jīng)常發(fā)生忘衍,導(dǎo)致播放不流暢逾苫,播放不流暢帶來(lái)的負(fù)面影響就是延時(shí)增大。如何在網(wǎng)絡(luò)抖動(dòng)的情況下保證播放的流暢性和實(shí)時(shí)性是保障直播性能的難點(diǎn)枚钓。針對(duì)上述提到的問(wèn)題铅搓,下面會(huì)一一討論。
二搀捷、播放器秒開(kāi)
目前市面上有些APP點(diǎn)擊播放后畫面出現(xiàn)非承顷快,有些則需要等較長(zhǎng)的時(shí)
間嫩舟。畫面出現(xiàn)的越快氢烘,體驗(yàn)越好。那么怎樣才能做到呢家厌?
圖1所示為一個(gè)簡(jiǎn)單的直播流程播玖,推流端將音視頻數(shù)據(jù)推送到服務(wù)器端,播放端從服務(wù)器端拉取音視頻數(shù)據(jù)進(jìn)行播放饭于。秒開(kāi)主要可以從以下兩個(gè)方面進(jìn)行優(yōu)化:
(1)優(yōu)化服務(wù)器策略
播放器接入服務(wù)器請(qǐng)求數(shù)據(jù)的時(shí)間點(diǎn)的視頻幀不一定是關(guān)鍵幀蜀踏,那么需要等到下一個(gè)關(guān)鍵幀的到來(lái),如果關(guān)鍵幀的周期是2s的話掰吕,那么等待的時(shí)間可能會(huì)在0~2s的范圍內(nèi)果覆,這段等待的時(shí)間會(huì)影響首屏的加載時(shí)間。如果服務(wù)器有緩存殖熟,則播放端在接入的時(shí)候局待,服務(wù)器可以向前找最近的關(guān)鍵幀發(fā)給播放端,這樣就可以省去等待的時(shí)間,可以大大的減少首屏的加載時(shí)間燎猛。
(2)優(yōu)化播放端策略
播放端請(qǐng)求到的第一幀數(shù)據(jù)肯定是關(guān)鍵幀恋捆,關(guān)鍵幀能夠通過(guò)幀內(nèi)參考進(jìn)行解
碼。這樣播放端就可以在接收到第一個(gè)關(guān)鍵幀的時(shí)候就立即開(kāi)始解碼顯示重绷,而不需要等到緩存一定數(shù)量的視頻幀才開(kāi)始解碼沸停,這樣也能減少首屏畫面顯示的時(shí)間。
圖1 直播流程
三昭卓、流暢度優(yōu)化
由上文可知愤钾,視頻在播放的過(guò)程中不發(fā)生卡頓,則流暢度越好候醒,體驗(yàn)越佳能颁。
目前主流的直播協(xié)議是RTMP、HTTP-FLV和HLS倒淫,都是基于TCP的長(zhǎng)連接伙菊。在播放的過(guò)程中,若播放端所處的網(wǎng)絡(luò)環(huán)境在一個(gè)較佳的狀態(tài)敌土,此時(shí)播放會(huì)很流暢镜硕。若網(wǎng)絡(luò)環(huán)境不是很穩(wěn)定,經(jīng)常會(huì)發(fā)生抖動(dòng)返干,如果播放端沒(méi)有做特殊處理兴枯,可能會(huì)經(jīng)常發(fā)生卡頓,嚴(yán)重的甚至?xí)霈F(xiàn)黑屏矩欠。而移動(dòng)直播由于其便捷性财剖,用戶可以隨時(shí)隨地發(fā)起和觀看直播,我們無(wú)法保證用戶的網(wǎng)絡(luò)一直處于一個(gè)非常好的狀態(tài)癌淮,所以躺坟,在網(wǎng)絡(luò)不穩(wěn)定的情況下保證播放的流暢度是非常重要的。
為了解決這個(gè)問(wèn)題该默,首先播放器需要將拉流線程和解碼線程分開(kāi)瞳氓,并建立一個(gè)緩沖隊(duì)列用于緩沖音視頻數(shù)據(jù)。拉流線程將從服務(wù)器上獲取到的音視頻流放入隊(duì)列栓袖,解碼線程從隊(duì)列中獲取音視頻數(shù)據(jù)進(jìn)行解碼播放匣摘,隊(duì)列的長(zhǎng)度可以調(diào)整。當(dāng)網(wǎng)絡(luò)發(fā)生抖動(dòng)時(shí)裹刮,播放器無(wú)法從服務(wù)器上獲取到數(shù)據(jù)或獲取數(shù)據(jù)的速度較慢音榜,此時(shí)隊(duì)列中緩存的數(shù)據(jù)可以起到一個(gè)過(guò)渡的作用,讓用戶感覺(jué)不到網(wǎng)絡(luò)發(fā)生了抖動(dòng)捧弃。
當(dāng)然這是對(duì)于網(wǎng)絡(luò)發(fā)生抖動(dòng)的情況所采取的策略赠叼,如果播放端的網(wǎng)絡(luò)遲遲不能恢復(fù)或者服務(wù)器的邊緣結(jié)點(diǎn)出現(xiàn)宕機(jī)擦囊,則需要應(yīng)用層進(jìn)行重連或調(diào)度。