《直播疑难杂症排查》之二:播放卡顿
##播放卡頓的表現
播放卡頓的表現總結下來包括但不限于以下這些:
-
頻繁出現緩沖
-
播放不夠流暢,畫面一卡一卡的
##常見播放卡頓問題排查
從代碼層面來看,什么是卡頓?其實是指播放器渲染的幀率太低,比如:1s 顯示 3~5 幀,或者渲染完一幀后,過很久才渲染下一幀。
因此,我們需要排查,是什么原因導致了播放器無法流暢地渲染數據,通常可能有如下幾大類:
-
網絡帶寬不足
-
播放設備性能不足
-
視頻流時間戳問題
下面我們一一來分析下具體的原因。
###原因一:網絡帶寬不足
一個完整的直播應用,簡單來說數據流是這樣的:主播 -> CDN -> 觀眾
因此,直播出現卡頓,三個端都可能是問題的源頭:
那么,我們如何確切地判斷是哪一個環節出了問題導致的播放卡頓呢 ?
如何判斷主播網絡不好
主播端網絡不好,直接影響到的就是千千萬萬的觀眾,因此,如果發現所有的觀眾都出現頻繁卡頓,那么多半就是主播端的問題了。
帶寬測試 用帶寬測試工具http://www.speedtest.net/?測試下主播的帶寬,如果主播的上行帶寬明顯小于推流的碼率,那么肯定會出現推流幀率不穩定。
統計回調 一般的推流 SDK 都會統計主播推流的實時視頻幀率,如果預設的幀率是 20?fps,但是實際的幀率低得很多,比如 5?fps,排除手機性能低的原因的話,多半也是網絡帶寬不足引起的。
CDN 廠商給出的后臺統計 比如,七牛直播云就給我們的每一個客戶提供了如下的后臺 Portal 界面,可以用于監控每一個主播的實時推流情況:?
從這個圖來看,該主播的推流上行其實還是蠻穩定的,一直在 20 fps 左右。
如何判斷觀眾端網絡不好
觀眾是整個直播的終端環節,一般如果不是大面積的觀眾出現卡頓,那么很可能是這個觀眾自身的網絡問題,可以考慮切換到別的 WiFi 網絡,或者 4G 下播放試試,我們還可以通過如下手段,具體確認下是網絡的原因。
1.?帶寬測試 跟主播端類似,我們依然可以用帶寬測試工具,測試下觀眾端的帶寬,如果該觀眾的帶寬明顯低于主播的推流碼率,那么肯定會出現卡頓。
當然,還有一些更加專業的網絡性能測試工具,如 iperf,這里就不展開詳細的介紹了。
關于 CDN 線路質量,一方面可以通過聯系 CDN 廠商來排查,另一方面,也可以通過播放端的打點上報,統計出各家 CDN 的線路質量(比如:首開,卡頓率),分地區做一些線路的調整和優化。
七牛實時流網絡 (LiveNet)會根據網絡流量、各節點的連接、負載狀況及到用戶網絡的響應時間等綜合信息,實時地將用戶的請求調度到最佳服務節點上,同時可計算出最佳服務節點與視頻源節點的最佳網絡路徑,使用戶可以更快速的獲取到視頻內容,提高視頻服務的響應速度和用戶體驗。
###原因二:播放設備性能不足
越高清的碼率,對解碼的要求也越高,很多手機性能不足以支撐 720P 甚至 1080P 的視頻解碼,特別是很多低端的 Android 手機,因此導致實際解碼播放的幀率遠小于視頻碼流的實際幀率,從而產生卡頓。
解決這個問題的思路主要有如下幾個方面:
- 盡可能選擇使用硬解,充分利用 GPU 加速
- 如果有多種碼流,盡可能在低端機上選擇非高清碼流
- 增大緩沖區,有助于緩解解碼不穩定帶來的卡頓
###原因三:視頻流時間戳問題
這個問題也遇到的比較多,特別是客戶自己寫的推流 SDK 或者碼流經過一些轉碼處理后,沒有處理好音視頻時間戳從而產生的問題。播放器一般是嚴格根據碼流中的音視頻的時間戳來做音畫同步的,因此,如果碼流中的音視頻時間戳出現錯誤,肯定會影響到播放畫面的渲染時機。
例如,曾經遇到一個流的時間戳信息如下:
可以看到,它的視頻時間戳出現了「回退」,而播放器一般 master 主時鐘是單調遞增的,當后來的視頻幀小于了當前的主時鐘,播放器就會做丟幀處理,從而導致播放的視頻幀率遠低于實際碼流中的視頻幀率,從而產生卡頓現象。
這個問題的排查,大家可以修改 ffplay 源碼,把讀取到的每一幀音頻、視頻的時間戳打印出來看看,這里我給出對 ffplay 的修改 commit 記錄,大家可以參考一下:?https://github.com/Jhuster/pili-ffmpeg/commit/4d0476faba5016b291c2eed2c0a2cd6fe303bd50
轉自:七牛云的個人空間
總結
以上是生活随笔為你收集整理的《直播疑难杂症排查》之二:播放卡顿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《直播疑难杂症排查》之四:延时高
- 下一篇: 《直播疑难杂症排查系列》之一 :播放失败