一、概述
目前,移動視頻直播正處于一個高速膨脹的時期。游戲直播,秀場直播等APP鋪天蓋地。如何在千軍萬馬中脫穎而出,直播的實時性和流暢性是重中之重。
直播的實時性對于用戶體驗非常重要,主要體現(xiàn)在兩個方面:秒開和延時。秒開是指用戶點擊播放到看到畫面的時間非常短,在1秒之內(nèi);延時是指播放端的畫面和主播端的畫面的時間差,時間差越小,實時性越好,體驗越佳。
保證直播的流暢性是指在直播過程中保證播放不發(fā)生卡頓,卡頓是指在播放過程中聲音和畫面出現(xiàn)停滯,非常影響用戶體驗。造成卡頓的原因有幾種情況:(1)推流端網(wǎng)絡抖動導致數(shù)據(jù)無法發(fā)送到服務器,造成播放端卡頓;
(2)播放端網(wǎng)絡抖動導致數(shù)據(jù)累積在服務器上拉不下來,造成播放卡頓。
由于從服務器到播放器的網(wǎng)絡情況復雜,尤其是在3G和帶寬較差的WIFI
環(huán)境下,抖動和延遲經(jīng)常發(fā)生,導致播放不流暢,播放不流暢帶來的負面影響就是延時增大。如何在網(wǎng)絡抖動的情況下保證播放的流暢性和實時性是保障直播性能的難點。針對上述提到的問題,下面會一一討論。
二、播放器秒開
目前市面上有些APP點擊播放后畫面出現(xiàn)非常快,有些則需要等較長的時
間。畫面出現(xiàn)的越快,體驗越好。那么怎樣才能做到呢?
圖1所示為一個簡單的直播流程,推流端將音視頻數(shù)據(jù)推送到服務器端,播放端從服務器端拉取音視頻數(shù)據(jù)進行播放。秒開主要可以從以下兩個方面進行優(yōu)化:
(1)優(yōu)化服務器策略
播放器接入服務器請求數(shù)據(jù)的時間點的視頻幀不一定是關鍵幀,那么需要等到下一個關鍵幀的到來,如果關鍵幀的周期是2s的話,那么等待的時間可能會在0~2s的范圍內(nèi),這段等待的時間會影響首屏的加載時間。如果服務器有緩存,則播放端在接入的時候,服務器可以向前找最近的關鍵幀發(fā)給播放端,這樣就可以省去等待的時間,可以大大的減少首屏的加載時間。
(2)優(yōu)化播放端策略
播放端請求到的第一幀數(shù)據(jù)肯定是關鍵幀,關鍵幀能夠通過幀內(nèi)參考進行解
碼。這樣播放端就可以在接收到第一個關鍵幀的時候就立即開始解碼顯示,而不需要等到緩存一定數(shù)量的視頻幀才開始解碼,這樣也能減少首屏畫面顯示的時間。

圖1 直播流程
三、流暢度優(yōu)化
由上文可知,視頻在播放的過程中不發(fā)生卡頓,則流暢度越好,體驗越佳。
目前主流的直播協(xié)議是RTMP、HTTP-FLV和HLS,都是基于TCP的長連接。在播放的過程中,若播放端所處的網(wǎng)絡環(huán)境在一個較佳的狀態(tài),此時播放會很流暢。若網(wǎng)絡環(huán)境不是很穩(wěn)定,經(jīng)常會發(fā)生抖動,如果播放端沒有做特殊處理,可能會經(jīng)常發(fā)生卡頓,嚴重的甚至會出現(xiàn)黑屏。而移動直播由于其便捷性,用戶可以隨時隨地發(fā)起和觀看直播,我們無法保證用戶的網(wǎng)絡一直處于一個非常好的狀態(tài),所以,在網(wǎng)絡不穩(wěn)定的情況下保證播放的流暢度是非常重要的。
為了解決這個問題,首先播放器需要將拉流線程和解碼線程分開,并建立一個緩沖隊列用于緩沖音視頻數(shù)據(jù)。拉流線程將從服務器上獲取到的音視頻流放入隊列,解碼線程從隊列中獲取音視頻數(shù)據(jù)進行解碼播放,隊列的長度可以調(diào)整。當網(wǎng)絡發(fā)生抖動時,播放器無法從服務器上獲取到數(shù)據(jù)或獲取數(shù)據(jù)的速度較慢,此時隊列中緩存的數(shù)據(jù)可以起到一個過渡的作用,讓用戶感覺不到網(wǎng)絡發(fā)生了抖動。
當然這是對于網(wǎng)絡發(fā)生抖動的情況所采取的策略,如果播放端的網(wǎng)絡遲遲不能恢復或者服務器的邊緣結(jié)點出現(xiàn)宕機,則需要應用層進行重連或調(diào)度。