老生常談,聊聊直播延遲
這篇盡量用能聽懂的方式來說。
事件的起因是。今天快手真心夜的騰訊視頻直播流。比快手慢了不少。
幾個群里都在問衛(wèi)視有沒有延遲。快手有沒有延遲。騰訊怎么延遲這么大。一系列。所以想講講這事兒。算作更新技術(shù)博客?
老粉別打我,我知道我又水……更細(xì)致點(diǎn)的 ?幾年前會上講過,你們?nèi)シ?/p>
1. 直播有沒有延遲
有。任何形式任何平臺的直播都有??隙ㄓ?。
只是時長不一樣。
2. 直播延遲如何產(chǎn)生的
大部分人會以為是網(wǎng)絡(luò)。網(wǎng)絡(luò)其實還好吧。一般直播的延遲,大頭是緩存產(chǎn)生的。并不是網(wǎng)絡(luò)。(此處需要嚴(yán)謹(jǐn)一點(diǎn),這里的一般直播指的是網(wǎng)絡(luò)直播是指淘寶 抖音 快手帶貨那種 以及斗魚虎牙B站游戲那種 分發(fā)式網(wǎng)絡(luò)直播。并不包含會議、語音聊天、一類的直播場景)
然后就從采集到觀看的順序說一下。哪有緩存。
第一步就是綜藝、比賽。畫面由導(dǎo)播臺給到編碼器。然后有些直接會過一道加延遲的機(jī)器。做緩存。就是為了應(yīng)對現(xiàn)場突發(fā)狀況直接放棄緩存不要了。
第二個地方是在服務(wù)端上行邊緣節(jié)點(diǎn)。這有個知識點(diǎn):大部分網(wǎng)絡(luò)直播用的分發(fā)網(wǎng)絡(luò)。即 上行邊緣節(jié)點(diǎn)(離現(xiàn)場最近的)—> 源站 —> 分發(fā)網(wǎng)絡(luò)-> 下行邊緣節(jié)點(diǎn)(離觀眾最近的)于是有些時候這種需要加緩存保證內(nèi)容可控的也會直接做在上行邊緣節(jié)點(diǎn)。
第三個地方 分發(fā)網(wǎng)絡(luò)。并不是每份數(shù)據(jù)都是直接傳給我們每個人的。實際上在分發(fā)網(wǎng)絡(luò)中。我們每個用戶都在和他人共享同一份數(shù)據(jù)。原理是。某個邊緣節(jié)點(diǎn)。比如有十個人。它會把這段數(shù)據(jù)給這十個人。當(dāng)邊緣節(jié)點(diǎn)沒有。就向上一級服務(wù)區(qū)要數(shù)據(jù)。再沒有。上一級服務(wù)區(qū)會去源站取數(shù)據(jù)。所謂大的回源就是這樣了。當(dāng)然。越是冷門的直播。邊緣節(jié)點(diǎn)有數(shù)據(jù)的概率越小。就成了冷流。這樣每一級分發(fā)都會緩存數(shù)據(jù)。就出現(xiàn)了延遲。
3. 播放器
播放器為了防止卡頓也會緩存數(shù)據(jù)。我一般會把緩存時長給到500毫米左右。也就是10-30幀。另外,有一點(diǎn)很重要:直播播放器必須追幀!
什么是追幀?
就是當(dāng)卡頓發(fā)生。因為緩存就在那里。你卡一下就從下一幀開始播的。所以約卡,累計延遲也就越高。
這批評一下騰訊視頻。點(diǎn)名批評。直播開始的時候我看了眼。快手給的流確實加了延遲。但是沒多少。然后我去寫代碼了。快下班的時候,發(fā)現(xiàn)要錄的東西開始了。就錄了。錄完,傳了群里。發(fā)現(xiàn)騰訊看直播的姑娘一臉茫然:不是剛開始嗎?我就想問 追幀了嗎?累計延遲處理了嗎?
這里其實也不能完全怪騰訊視頻。確實一般主辦平臺會給其他平臺的信號直接加個延遲。大部分在一分鐘左右。確保自己平臺的觀看數(shù)據(jù)。無可厚非。
另外。我一般代碼里追幀頻率是檢測卡頓,小幅卡頓也算即便用戶感知不到。計算一個累積卡頓時長。到點(diǎn)兒就看看當(dāng)前狀態(tài),當(dāng)前卡沒卡,緩存里有沒有。有就快進(jìn)。沒有嘛。重新拉流吧親。
差不多就這么多。至于Webrtc延遲…反正webrtc承載不了這大幾百萬人一起看直播。這里不想說了。

重申一點(diǎn):大部分情況下和當(dāng)前網(wǎng)絡(luò)狀況沒太大關(guān)系網(wǎng)差只會卡 (除非播放器不好好寫)
Ps:無意爭吵。涉及我專業(yè)領(lǐng)域,會較真一點(diǎn)。杠精注意:1.?網(wǎng)絡(luò)有延遲。但是這種分發(fā)式的直播,網(wǎng)絡(luò)延遲遠(yuǎn)小于緩存導(dǎo)致的延遲。2. 卡頓會造成延遲。前提是播放器沒寫好。3. 無意爭吵,就事論事。
另外,今年北京LVS會去跟大家聚聚,不講。新東西能寫出來文章的時候會給LVS投稿,大家去關(guān)注LVS微信號就行。

群:711929228????
進(jìn)群問題:哈希查找時間復(fù)雜度?
O(1)原理自行百度。