直播疑難雜症排查(3)— 首開慢

本文是 《直播疑難雜症排查》系列的第三篇文章,我們來看看直播過程中,最重要的一個性能指標:首開。

1. 首開慢的表現

點擊播放後,需要好幾秒才能顯示播放畫面。

2. 常見首開慢問題排查

2.1 點擊播放後才從伺服器取播放地址

播放視頻,第一件事就是要拿到播放地址,大多數直播 App,主播的播放地址是由 App 向服務端發 HTTP GET 請求才能拿到的,因此,什麼時候去 「拿」 這個播放地址,顯得至關重要,常見的做法有如下兩種:

- App 拉取正在視頻列表的時候

- 用戶點擊某個視頻,跳轉到播放界面之後

顯然,後者的用戶體驗明顯會比前者差,因為通過 HTTP GET 請求播放地址的過程,無形增加了首開時間,特別是在弱網下,會更慢。

2.2 DNS 解析慢

不同的播放域名,DNS 解析有快有慢,再加上 DNS 解析服務的緩存策略,在本地沒有該域名緩存的情況下,會逐級向更高級的域名伺服器查詢域名,因此,播放域名解析的耗時,會對首開產生不小的影響。

為了有效降低 DNS 解析對首開的影響,我們可以提前完成播放域名->IP 地址的解析,並緩存起來,播放的時候,直接傳入帶 IP 地址的播放地址,從而省去了 DNS 解析的耗時。

如果要支持用 ip 地址播放,是需要修改底層 ffmpeg 源碼的,目前七牛的 PLDroidPlayer 就支持這樣的播放地址:

URL 格式:「protocol://ip/path?domain=xxxx.com」

2.3 播放策略原因

播放首開時間的定義,就是從點擊播放到第一幀畫面顯示出來的耗時,因此,我們需要盡一切可能加快播放進度。

很多側重點播的播放器,為了減少卡頓,會有一些緩衝策略,當緩衝足夠多的數據之後 ,再送入解碼播放。

而為了加快首開效果,需要對播放的緩衝策略做一些調整,如果第一幀還沒有渲染出來的情況下,不要做任何緩衝,直接送入解碼器解碼播放,這樣就可以保證沒有任何因為 「主動」 緩衝帶來的首開延時。

2.4 播放參數配置

所有基於 ffmpeg 的播放器,都會遇到 `avformat_find_stream_info` 這個函數耗時比較久,從而增大了首開時間,該函數主要作用是通過讀取一定位元組的碼流數據,來分析碼流的基本信息,如編碼信息、時長、碼率、幀率等等,它由兩個參數來控制其讀取的數據量大小和時長,一個是 probesize,一個是 analyzeduration

減少 probesize 和 analyzeduration 可以有效地減少 `avformat_find_stream_info` 的函數耗時,從而加快首開,但是需要注意的是,設置地太小可能會導致讀取的數據量不足,從而無法解析出碼流信息,導致播放失敗,或者出現只有音頻沒有視頻,只有視頻沒有音頻的問題。

2.5 服務端線路原因

當播放端的優化做到極限後,剩下的首開快慢的決定性因素就是服務端的線路了,服務端的線路主要有哪些方面會影響首開呢?

- 冷熱流

當你去附近的邊緣伺服器節點拉取某個流的時候,如果最近沒有任何人從該伺服器拉過這個流,那麼這台伺服器就需要逐級向源頭拉流,而且該伺服器也沒有任何 GOP 緩存,從而產生比較大的首開延時。

- 邊緣節點的 TTL

同等大小的數據,客戶端距離伺服器越近,ttl 越小,那麼傳輸速度也就越快,首開也會越快。

- 伺服器的響應速度

影響伺服器響應速度的因素,一個是跟伺服器的協議層優化有關,另一個就是服務端的負載和性能了,伺服器當前負載越大,響應自然越慢。

下面給出一張圖,來直觀的感受一下服務端在加速首開這件事上的關鍵作用:

3. 小結

關於播放首開慢的問題排查大致就介紹道這裡了,有任何疑問歡迎來信 lujun.hust@gmail.com 交流,另外,歡迎關注我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。


推薦閱讀:

如何評價2017.11.22德雲色鬥魚直播笑笑直播哭訴?
不是直播沒價值,只是姿勢沒選對
主播奮鬥1月夠吃10年,直播行業扎堆搞盛典到底為哪般?

TAG:直播 | 音视频 | 播放器 |