本文轉(zhuǎn)自:直播中的首屏加載優(yōu)化 | www.samirchen.com
直播中的首屏加載時(shí)間指的是進(jìn)入直播間時(shí)從播放器加載到第一幀畫面渲染出來的時(shí)間仅胞,這個(gè)時(shí)間是直播體驗(yàn)中的一項(xiàng)重要的指標(biāo)亭罪。這篇文章就簡要介紹一下優(yōu)化直播首屏加載時(shí)間的一些經(jīng)驗(yàn)。
客戶端業(yè)務(wù)側(cè)優(yōu)化
說到優(yōu)化枷餐,首先要看客戶端上進(jìn)入直播間的業(yè)務(wù)場(chǎng)景是什么樣的瞧哟?一般而言玩裙,都是從一個(gè)直播列表頁面姊舵,點(diǎn)擊某一個(gè)直播卡片(Cell)即進(jìn)入直播間。這個(gè)過程中寞奸,數(shù)據(jù)流是怎么走的呢呛谜?最簡單的做法是,從直播列表頁點(diǎn)擊某個(gè)直播卡片到直播間后枪萄,從服務(wù)器請(qǐng)求直播流地址以及各種直播間信息(主播信息隐岛、聊天信息、點(diǎn)贊信息瓷翻、禮物信息等等)聚凹,拿到直播流地址后,交給播放器播放齐帚。
在這個(gè)過程中妒牙,我們可以看到播放器必須等到進(jìn)入直播間請(qǐng)求到直播流地址后才能開始播放,這個(gè)時(shí)間點(diǎn)其實(shí)是可以提前的:我們可以在直播列表頁就拿到每個(gè)直播間對(duì)應(yīng)的直播流地址对妄,在進(jìn)入直播間時(shí)直接傳過去湘今,這樣一進(jìn)入直播間播放器就可以拿著直播流地址開始播放了,省去了從服務(wù)器請(qǐng)求直播流地址的時(shí)間(雖然這個(gè)時(shí)間可能沒多少)剪菱。
甚至摩瞎,我們可以在直播列表頁當(dāng)滑到一個(gè)卡片就讓播放器拿著直播流地址預(yù)加載,進(jìn)入直播間時(shí)則直接展示畫面琅豆。
另外愉豺,客戶端業(yè)務(wù)側(cè)還可以在進(jìn)入直播間之前通過 HTTPDNS 來選擇網(wǎng)絡(luò)情況最好的 CDN 節(jié)點(diǎn),在進(jìn)入直播間時(shí)從最好的節(jié)點(diǎn)拉取直播流播放從而優(yōu)化網(wǎng)絡(luò)加載的時(shí)間茫因,加快首屏渲染。
流媒體服務(wù)器側(cè)優(yōu)化
除了客戶端業(yè)務(wù)側(cè)的優(yōu)化外杖剪,我們還可以從流媒體服務(wù)器側(cè)進(jìn)行優(yōu)化冻押。我們都知道直播流中的圖像幀分為:I 幀驰贷、P 幀、B 幀洛巢,其中只有 I 幀是能不依賴其他幀獨(dú)立完成解碼的括袒,這就意味著當(dāng)播放器接收到 I 幀它能馬上渲染出來,而接收到 P 幀稿茉、B 幀則需要等待依賴的幀而不能立即完成解碼和渲染锹锰,這個(gè)期間就是「黑屏」了。
所以漓库,在服務(wù)器端可以通過緩存 GOP(以 I 幀開頭的一組圖像幀序列)恃慧,保證播放端在接入直播時(shí)能先獲取到 I 幀馬上渲染出畫面來,從而優(yōu)化首屏加載的體驗(yàn)渺蒿。
直播播放器側(cè)優(yōu)化
當(dāng)我們做直播業(yè)務(wù)時(shí)痢士,播放端需要一個(gè)播放器來播放視頻流,當(dāng)一個(gè)播放器支持的視頻格式有很多種時(shí)茂装,問題就來了怠蹂。一個(gè)視頻流來了,播放器是不清楚這個(gè)視頻流是什么格式的少态,所以它需要去探測(cè)到一定量的視頻流信息城侧,去檢測(cè)它的格式并決定如何去處理它。這就意味著在播放視頻前有一個(gè)數(shù)據(jù)預(yù)讀過程和一個(gè)分析過程彼妻。但是對(duì)于我們的直播業(yè)務(wù)來說嫌佑,我們的提供的直播方案通常是固定的,這就意味著視頻流的格式通常是固定的澳骤,所以一些數(shù)據(jù)預(yù)讀和分析過程是不必要的歧强。在直播流協(xié)議格式固定的情況下,只需要讀取固定的信息即可開始播放为肮。這樣就縮短了數(shù)據(jù)預(yù)讀和分析的時(shí)間摊册,使得播放器能夠更快地渲染出首屏畫面。