《直播疑難雜症排查》之二:播放卡頓

七牛雲發表於2017-04-27

七牛直播雲在 2016 年 6 月釋出之後,幫助廣大客戶解決過形形色色的問題,如直播卡頓、馬賽克、花屏、黑屏、雜音、音畫不同步等等等等,這其中,有一些是網路原因,有一些是開發者的使用姿勢問題,有一些是引數配置錯誤,當然,也有一些是 SDK 本身的問題。

總結下來,如果開發者能夠對直播領域的一些基礎知識有更深入的瞭解,掌握一些基本的排障手段,很多問題是能夠很快自行解決的,甚至也能夠更好地防患於未然。

因此,繼《直播技術詳解》系列文章之後,我們推出了這個新的系列《直播疑難雜症排查》,我們會把協助客戶解決直播問題的經驗逐步分享出來,同時也會穿插一些音視訊開發的基礎知識和優化經驗,希望能夠幫助到直播領域的開發者們。


本系列會涵蓋的內容包括但不限於如下一些主題:

  • 播放失敗

  • 直播卡頓

  • 首開慢
  • 延時高
  • 音畫不同步
  • 馬賽克嚴重
  • 播放黑屏、花屏、綠屏
  • 播放雜音、噪音、回聲
  • 點播拖動不準
  • 直播發熱問題
  • 其他問題(待續)

本文是 《直播疑難雜症排查》系列的第二篇文章,我們主要分析下如何排查播放卡頓問題


播放卡頓的表現

播放卡頓的表現總結下來包括但不限於以下這些: - 頻繁出現緩衝

  • 播放不夠流暢,畫面一卡一卡的

常見播放卡頓問題排查

從程式碼層面來看,什麼是卡頓?其實是指播放器渲染的幀率太低,比如:1s 顯示 3~5 幀,或者渲染完一幀後,過很久才渲染下一幀。

因此,我們需要排查,是什麼原因導致了播放器無法流暢地渲染資料,通常可能有如下幾大類: - 網路頻寬不足

  • 播放裝置效能不足

  • 視訊流時間戳問題

下面我們一一來分析下具體的原因。

原因一:網路頻寬不足

一個完整的直播應用,簡單來說資料流是這樣的:主播 -> CDN -> 觀眾

因此,直播出現卡頓,三個端都可能是問題的源頭: 1. 主播端的網路不好,導致推流上行不穩定 2. 服務端的線路質量不好,導致分發不穩定 3. 觀眾端的網路不好,導致拉流下行不穩定

那麼,我們如何確切地判斷是哪一個環節出了問題導致的播放卡頓呢 ?

如何判斷主播網路不好

主播端網路不好,直接影響到的就是千千萬萬的觀眾,因此,如果發現所有的觀眾都出現頻繁卡頓,那麼多半就是主播端的問題了。

  1. 頻寬測試 用頻寬測試工具http://www.speedtest.net/ 測試下主播的頻寬,如果主播的上行頻寬明顯小於推流的位元速率,那麼肯定會出現推流幀率不穩定。

  2. 統計回撥 一般的推流 SDK 都會統計主播推流的實時視訊幀率,如果預設的幀率是 20 fps,但是實際的幀率低得很多,比如 5 fps,排除手機效能低的原因的話,多半也是網路頻寬不足引起的。

  3. CDN 廠商給出的後臺統計 比如,七牛直播雲就給我們的每一個客戶提供瞭如下的後臺 Portal 介面,可以用於監控每一個主播的實時推流情況:

從這個圖來看,該主播的推流上行其實還是蠻穩定的,一直在 20 fps 左右。

如何判斷觀眾端網路不好

觀眾是整個直播的終端環節,一般如果不是大面積的觀眾出現卡頓,那麼很可能是這個觀眾自身的網路問題,可以考慮切換到別的 WiFi 網路,或者 4G 下播放試試,我們還可以通過如下手段,具體確認下是網路的原因。

1. 頻寬測試 跟主播端類似,我們依然可以用頻寬測試工具,測試下觀眾端的頻寬,如果該觀眾的頻寬明顯低於主播的推流位元速率,那麼肯定會出現卡頓。

  1. 網路質量測試 可以在觀眾端的網路下,ping 一下播放域名,看看當前丟包率是多少,一般好的網路,ping 值的丟包率是 0%。

當然,還有一些更加專業的網路效能測試工具,如 iperf,這裡就不展開詳細的介紹了。

  1. 如何判斷 CDN 線路不好 如果排除了主播端上行網路原因以及觀眾端下行的網路原因,那麼,剩下的就很可能是 CDN 線路質量原因了。

關於 CDN 線路質量,一方面可以通過聯絡 CDN 廠商來排查,另一方面,也可以通過播放端的打點上報,統計出各家 CDN 的線路質量(比如:首開,卡頓率),分地區做一些線路的調整和優化。

七牛實時流網路 (LiveNet)會根據網路流量、各節點的連線、負載狀況及到使用者網路的響應時間等綜合資訊,實時地將使用者的請求排程到最佳服務節點上,同時可計算出最佳服務節點與視訊源節點的最佳網路路徑,使使用者可以更快速的獲取到視訊內容,提高視訊服務的響應速度和使用者體驗。

原因二:播放裝置效能不足

越高清的位元速率,對解碼的要求也越高,很多手機效能不足以支撐 720P 甚至 1080P 的視訊解碼,特別是很多低端的 Android 手機,因此導致實際解碼播放的幀率遠小於視訊碼流的實際幀率,從而產生卡頓。

解決這個問題的思路主要有如下幾個方面: - 儘可能選擇使用硬解,充分利用 GPU 加速 - 如果有多種碼流,儘可能在低端機上選擇非高清碼流 - 增大緩衝區,有助於緩解解碼不穩定帶來的卡頓

原因三:視訊流時間戳問題

這個問題也遇到的比較多,特別是客戶自己寫的推流 SDK 或者碼流經過一些轉碼處理後,沒有處理好音視訊時間戳從而產生的問題。播放器一般是嚴格根據碼流中的音視訊的時間戳來做音畫同步的,因此,如果碼流中的音視訊時間戳出現錯誤,肯定會影響到播放畫面的渲染時機。

例如,曾經遇到一個流的時間戳資訊如下:

可以看到,它的視訊時間戳出現了「回退」,而播放器一般 master 主時鐘是單調遞增的,當後來的視訊幀小於了當前的主時鐘,播放器就會做丟幀處理,從而導致播放的視訊幀率遠低於實際碼流中的視訊幀率,從而產生卡頓現象。

這個問題的排查,大家可以修改 ffplay 原始碼,把讀取到的每一幀音訊、視訊的時間戳列印出來看看,這裡我給出對 ffplay 的修改 commit 記錄,大家可以參考一下: https://github.com/Jhuster/pili-ffmpeg/commit/4d0476faba5016b291c2eed2c0a2cd6fe303bd50

小結

關於播放卡頓的問題排查大致就介紹到這裡了,下篇我們將對首開慢這個話題進行探討。如果你對七牛直播雲感興趣,歡迎點選 http://t.cn/RXEf0Ac 瞭解詳情。


本文作者:盧俊@七牛雲。如果有你感興趣的問題,但是不在上述列表中,也可以來信 lujun.hust@gmail.com 交流,歡迎關注新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。

相關文章