直播系統(tǒng)保持流暢簡(jiǎn)析

直播系統(tǒng)流暢保證設(shè)計(jì)要點(diǎn)淺析

視頻播放不流暢,一般有兩個(gè)原因:
視頻播放不均勻。
比如,視頻幀原本是40ms一幀,如果我們播放的時(shí)候,一會(huì)20秒一幀進(jìn)行播放,一會(huì)兒60秒一幀進(jìn)行播放,那么最后結(jié)果必定是會(huì)出現(xiàn)卡頓。當(dāng)然,如果根據(jù)視頻時(shí)間戳,視頻幀間隔本來(lái)是20-60幀,我們強(qiáng)行按照40-40播放,也會(huì)進(jìn)行卡頓。也就是說(shuō),視頻播放時(shí),不遵循時(shí)間戳,將會(huì)導(dǎo)致卡頓發(fā)生。
視頻有丟幀。
視頻出現(xiàn)丟幀后,會(huì)導(dǎo)致視頻不流暢。如果連續(xù)的丟幀太多,會(huì)導(dǎo)致出現(xiàn)明顯卡頓。如果參考幀丟失,則會(huì)影響到之后若干個(gè)幀。

視頻出現(xiàn)馬賽克,一般有兩個(gè)原因:
視頻ES不完整,也就是說(shuō),出現(xiàn)了數(shù)據(jù)丟包。
解碼器解碼非參考幀時(shí),參考了錯(cuò)誤的參考幀。例如一個(gè)非參考幀之前的那個(gè)參考幀丟失,那么會(huì)導(dǎo)致本幀會(huì)參考上上個(gè)參考幀,從而可能出現(xiàn)馬賽克。

事實(shí)上,在web網(wǎng)絡(luò)中,網(wǎng)絡(luò)情況非常復(fù)雜。同時(shí)保證視頻的實(shí)時(shí)性和流暢性,是很難的。但是,犧牲實(shí)時(shí)性來(lái)保證流暢,這個(gè)是可以做到的。下面,將從3個(gè)方面來(lái)研究怎么來(lái)讓視頻的播放體驗(yàn)更好。(下面的優(yōu)化,暫不考慮動(dòng)態(tài)切換碼率。)

視頻編碼發(fā)送端的優(yōu)化。
編碼發(fā)送端,首先必須保證時(shí)間戳的準(zhǔn)確性,輸入給編碼器視頻幀的時(shí)候,準(zhǔn)確告訴其時(shí)間戳。時(shí)間戳精確度可以達(dá)不到27MHz,這個(gè)沒(méi)關(guān)系,但準(zhǔn)確性要保證。當(dāng)然,精度需要至少達(dá)到毫秒級(jí)。
編碼器發(fā)送數(shù)據(jù)的目標(biāo),是保證所有數(shù)據(jù)都完整的發(fā)送到服務(wù)器端。但網(wǎng)絡(luò)情況的復(fù)雜性,可能導(dǎo)致一些時(shí)候偶爾無(wú)法做到這一點(diǎn)。我們要做到的是,就是讓偶然的網(wǎng)絡(luò)故障不影響網(wǎng)絡(luò)數(shù)據(jù)的完整性。因此,我們需要在發(fā)送端進(jìn)行數(shù)據(jù)緩存。需要建立一個(gè)發(fā)送緩沖區(qū),編碼后的數(shù)據(jù),交給發(fā)送緩沖區(qū),然后由發(fā)送模塊全力將發(fā)送緩沖區(qū)內(nèi)容發(fā)送到服務(wù)器。
如果網(wǎng)絡(luò)出現(xiàn)意外的時(shí)間較長(zhǎng),或者網(wǎng)絡(luò)中斷。如果數(shù)據(jù)不斷被提交給發(fā)送緩沖區(qū),而發(fā)送模塊一直未能將發(fā)送緩沖區(qū)的數(shù)據(jù)發(fā)送到服務(wù)器,這樣會(huì)導(dǎo)致發(fā)送緩沖區(qū)的數(shù)據(jù)越來(lái)越多。因此我們必須為發(fā)送緩沖區(qū)設(shè)定一個(gè)上限。此處需要說(shuō)的是,如果緩沖區(qū)滿了之后的丟幀策略:丟幀必須整幀整幀的丟,不能丟半截;優(yōu)先丟時(shí)間戳更早的幀;優(yōu)先丟非參考幀;如果參考幀被丟,那么到下一個(gè)參考幀之前的幀,全部需要丟掉。
網(wǎng)絡(luò)模塊可以失敗重連,但重連之后必須繼續(xù)重連之前的數(shù)據(jù)發(fā)送任務(wù)。發(fā)送成功的半幀數(shù)據(jù),視作發(fā)送失敗,需要重發(fā)。
流媒體服務(wù)器端的優(yōu)化。
流媒體服務(wù)器,需要將收到的數(shù)據(jù)進(jìn)行分發(fā)。數(shù)據(jù)接收部分,流媒體服務(wù)器是被動(dòng)的,除了實(shí)做方式的優(yōu)化,理論上的可用的改進(jìn)基本沒(méi)有。
流媒體服務(wù)器的數(shù)據(jù)分發(fā),是由播放器端主動(dòng)請(qǐng)求發(fā)起的。那么服務(wù)器端需要處理的問(wèn)題是,在播放器端的網(wǎng)絡(luò)不穩(wěn)定的情況下,播放器能夠隨時(shí)獲取到之前因?yàn)榫W(wǎng)絡(luò)故障而未能獲取到的數(shù)據(jù)。因此,流媒體服務(wù)器端,也需要有緩存的數(shù)據(jù)。
流媒體服務(wù)器端,收到來(lái)自于編碼端的數(shù)據(jù)之后,需要能夠以幀或者GOP為單位來(lái)管理和視頻。從而避免緩存了半幀數(shù)據(jù),或者發(fā)送半幀數(shù)據(jù)這種事情。播放器端的優(yōu)化。
播放器端播放數(shù)據(jù),需要按照時(shí)間戳播放。避免在數(shù)據(jù)本身正常而因?yàn)椴シ哦鴮?dǎo)致的不均勻。
播放器端,需要加入緩存,避免服務(wù)器端的數(shù)據(jù)不均勻或者偶然的網(wǎng)絡(luò)故障。
數(shù)據(jù)播放時(shí),并不需要緩存區(qū)被填滿之后才開(kāi)始進(jìn)行解碼播放。比如,我們有20秒的接收緩存。那么我們可以這么做,當(dāng)緩沖區(qū)的數(shù)據(jù),不足8秒鐘時(shí),我們就可以開(kāi)始進(jìn)行播放,但播放時(shí),我們進(jìn)行略微的減速播放(比如,以時(shí)間戳的播放速率的0.9倍速度進(jìn)行播放)。如果緩沖區(qū)的數(shù)據(jù)超過(guò)了12秒鐘,那么我們可以加速播放(如正常速率的1.1倍速率)。這樣的話,我們的緩存區(qū)的數(shù)據(jù),基本會(huì)維持有10秒鐘左右的內(nèi)容。那么這樣的話,我們?cè)诿襟w數(shù)據(jù)中斷10秒鐘之后,依舊可以正常播放,只要媒體數(shù)據(jù)在10秒鐘之內(nèi)恢復(fù),那么我們依舊可以無(wú)縫切換到正常狀態(tài)。并且,用戶開(kāi)始播放時(shí),我們不會(huì)因?yàn)榫彺娑泻艽蟮牡却龝r(shí)間,而是立即開(kāi)始播放。
如果收到數(shù)據(jù)的速度遠(yuǎn)超過(guò)播放速度,以至于緩沖區(qū)不夠時(shí),丟幀策略和編碼發(fā)送端一致。
如果長(zhǎng)時(shí)間沒(méi)有收到任何數(shù)據(jù),可以播放一些其它內(nèi)容告知用戶網(wǎng)絡(luò)故障。當(dāng)數(shù)據(jù)恢復(fù)時(shí),需要從參考幀開(kāi)始播放,避免第一幀出現(xiàn)馬賽克。
直播系統(tǒng)的核心競(jìng)爭(zhēng)力就是視頻的流暢性、清晰度、時(shí)延。而其中以流暢性至關(guān)重要,特別是在惡劣情況下的流暢性,更加重要。如何去保證視頻的流暢性,以上幾點(diǎn)是否做到很關(guān)鍵,而這些是否能夠方便可靠的實(shí)現(xiàn),也是上傳下載協(xié)議選擇的重要參考標(biāo)準(zhǔn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容