關(guān)于直播,所有的技術(shù)細(xì)節(jié)都在這里了(三)
在分析了低延遲的直播傳輸架構(gòu)及優(yōu)化后,接下來我們將介紹在傳輸直播流媒體過程中的內(nèi)容緩存與傳輸策略優(yōu)化細(xì)節(jié)原理。
基礎(chǔ)知識:I幀、B幀、P幀。
I幀表示關(guān)鍵幀。你可以理解為這一幀畫面的完整保留;解碼時(shí)只需要本幀數(shù)據(jù)就可以完成。(因?yàn)榘暾嬅?
P幀表示這一幀跟之前的一個(gè)關(guān)鍵幀(或P幀)的差別。解碼時(shí)需要用之前緩存的畫面疊加上本幀定義的差別,生成最終畫面。(也就是差別幀,P幀沒有完整畫面數(shù)據(jù),只有與前一幀的畫面差別的數(shù)據(jù))
B幀是雙向差別幀。B幀記錄的是本幀與前后幀的差別(具體比較復(fù)雜,有4種情況)。換言之,要解碼B幀,不僅要取得之前的緩存畫面,還要解碼之后的畫面,通過前后畫面的與本幀數(shù)據(jù)的疊加取得最終的畫面。B幀壓縮率高,但是編解碼時(shí)會比較耗費(fèi)CPU,而且在直播中可能會增加直播延時(shí),因此在移動端上一般不使用B幀。
關(guān)鍵幀緩存策略
一個(gè)典型的視頻幀序列為IBBPBBPBBP……對于直播而言,為了減少直播的延時(shí),通常在編碼時(shí)不使用B幀。P幀B幀對于I幀都有直接或者間接的依賴關(guān)系,所以播放器要解碼一個(gè)視頻幀序列,并進(jìn)行播放,必須首先解碼出I幀,其后續(xù)的B幀和P幀才能進(jìn)行解碼,這樣服務(wù)端如何進(jìn)行關(guān)鍵幀的緩存,則對直播的延時(shí)以及其他方面有非常大的影響。
比較好的策略是服務(wù)端自動判斷關(guān)鍵幀的間隔,按業(yè)務(wù)需求緩存幀序列,保證在緩存中存儲至少兩個(gè)或者以上的關(guān)鍵幀,以應(yīng)對低延時(shí)、防卡頓、智能丟包等需求。
延遲與卡頓的折中
直播的延時(shí)與卡頓是分析直播業(yè)務(wù)質(zhì)量時(shí),非常關(guān)注的兩項(xiàng)指標(biāo)?;又辈サ膱鼍皩ρ訒r(shí)非常敏感,新聞體育類直播則更加關(guān)注播放的流暢度。然而,這兩項(xiàng)指標(biāo)從理論上來說,是一對矛盾的關(guān)系——需要更低的延時(shí),則表明服務(wù)器端和播放端的緩沖區(qū)都必須更短,來自網(wǎng)絡(luò)的異常抖動容易引起卡頓;業(yè)務(wù)可以接受較高的延時(shí)時(shí),服務(wù)端和播放端都可以有較長的緩沖區(qū),以應(yīng)對來自網(wǎng)絡(luò)的抖動,提供更流暢的直播體驗(yàn)。當(dāng)然,對于網(wǎng)絡(luò)條件非常好的用戶,這兩項(xiàng)是可以同時(shí)保證的,這里主要是針對網(wǎng)絡(luò)條件不是那么好的用戶,如何解決延時(shí)與卡頓的問題。
這里通常有兩種技術(shù)來平衡和優(yōu)化這兩個(gè)指標(biāo)。一是服務(wù)端提供靈活的配置策略,對于延時(shí)要求更敏感的,則在服務(wù)端在保證關(guān)鍵幀的情況下,對每個(gè)連接維持一個(gè)較小的緩沖隊(duì)列;對于卡頓要求更高的直播,則適當(dāng)增加緩沖隊(duì)列的長度,保證播放的流暢。二是服務(wù)端對所有連接的網(wǎng)絡(luò)情況進(jìn)行智能檢測,當(dāng)網(wǎng)絡(luò)狀況良好時(shí),服務(wù)端會縮小該連接的緩沖隊(duì)列的大小,降低延遲;而當(dāng)網(wǎng)絡(luò)狀況較差時(shí),特別是檢測到抖動較為明顯時(shí),服務(wù)端對該連接增加緩沖隊(duì)列長度,優(yōu)先保證播放的流暢性。
丟包策略
什么時(shí)候需要丟包呢?對于一個(gè)網(wǎng)絡(luò)連接很好,延時(shí)也比較小的連接,丟包策略永遠(yuǎn)沒有用武之地的。而網(wǎng)絡(luò)連接比較差的用戶,因?yàn)橄螺d速度比較慢或者抖動比較大,這個(gè)用戶的延時(shí)就會越來越高;另外一種情況是,如果直播流關(guān)鍵幀間隔比較長,那么在保證首包是關(guān)鍵幀的情況下,觀看這個(gè)節(jié)目的觀眾,延遲有可能會達(dá)到一個(gè)關(guān)鍵幀序列的長度。上述兩種情況,都需要啟用丟包策略,來調(diào)整播放的延時(shí)。
關(guān)于丟包,需要解決兩個(gè)問題:一是正確判斷何時(shí)需要進(jìn)行丟包;二是如何丟包以使得對觀眾的播放體驗(yàn)影響最小。較好的做法是后端周期監(jiān)控所有連接的緩沖隊(duì)列的長度,這樣隊(duì)列長度與時(shí)間形成一個(gè)離散的函數(shù)關(guān)系,后端通過自研算法來分析這個(gè)離散函數(shù),判斷是否需要丟包。一般的丟幀策略,就是直接丟棄一個(gè)完整的視頻幀序列,這種策略看似簡單,但對用戶播放的影響體驗(yàn)非常大。而應(yīng)該是后臺采用逐步丟幀的策略,每個(gè)視頻幀序列,丟***的一到兩幀,使得用戶的感知最小,平滑的逐步縮小延時(shí)的效果。
以上就是UCloud直播云:內(nèi)容緩存與傳輸策略優(yōu)化細(xì)節(jié)原理。關(guān)于接入網(wǎng)絡(luò)優(yōu)化、直播協(xié)議選擇、終端優(yōu)化,請參閱已發(fā)布或?qū)l(fā)布的其他部分。
點(diǎn)擊閱讀:關(guān)于直播,所有的技術(shù)細(xì)節(jié)都在這里了(一)http://www.scjtxx.cn/art/201605/511219.htm
點(diǎn)擊閱讀:關(guān)于直播,所有的技術(shù)細(xì)節(jié)都在這里了(二)http://www.scjtxx.cn/art/201605/511224.htm
預(yù)告:前面介紹了直播后端系統(tǒng)的原理及優(yōu)化,那么直播推流、播放端是否有可以優(yōu)化的點(diǎn)呢?答案是肯定的,客戶端的優(yōu)化對直播秒開、延遲體驗(yàn)的實(shí)現(xiàn)至關(guān)重要,請關(guān)注的《關(guān)于直播,所有的技術(shù)細(xì)節(jié)都在這里了(四)》,我們將帶來客戶端優(yōu)化的技術(shù)細(xì)節(jié)。