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

七牛直播雲在 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/RXE2k2K 瞭解詳情。


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章