《直播疑難雜症排查》之二:播放卡頓
七牛直播雲在 2016 年 6 月釋出之後,幫助廣大客戶解決過形形色色的問題,如直播卡頓、馬賽克、花屏、黑屏、雜音、音畫不同步等等等等,這其中,有一些是網路原因,有一些是開發者的使用姿勢問題,有一些是引數配置錯誤,當然,也有一些是 SDK 本身的問題。
總結下來,如果開發者能夠對直播領域的一些基礎知識有更深入的瞭解,掌握一些基本的排障手段,很多問題是能夠很快自行解決的,甚至也能夠更好地防患於未然。
因此,繼《直播技術詳解》系列文章之後,我們推出了這個新的系列《直播疑難雜症排查》,我們會把協助客戶解決直播問題的經驗逐步分享出來,同時也會穿插一些音視訊開發的基礎知識和優化經驗,希望能夠幫助到直播領域的開發者們。
本系列會涵蓋的內容包括但不限於如下一些主題:
直播卡頓
- 首開慢
- 延時高
- 音畫不同步
- 馬賽克嚴重
- 播放黑屏、花屏、綠屏
- 播放雜音、噪音、回聲
- 點播拖動不準
- 直播發熱問題
- 其他問題(待續)
本文是 《直播疑難雜症排查》系列的第二篇文章,我們主要分析下如何排查播放卡頓問題。
播放卡頓的表現
播放卡頓的表現總結下來包括但不限於以下這些: - 頻繁出現緩衝
- 播放不夠流暢,畫面一卡一卡的
常見播放卡頓問題排查
從程式碼層面來看,什麼是卡頓?其實是指播放器渲染的幀率太低,比如:1s 顯示 3~5 幀,或者渲染完一幀後,過很久才渲染下一幀。
因此,我們需要排查,是什麼原因導致了播放器無法流暢地渲染資料,通常可能有如下幾大類: - 網路頻寬不足
播放裝置效能不足
視訊流時間戳問題
下面我們一一來分析下具體的原因。
原因一:網路頻寬不足
一個完整的直播應用,簡單來說資料流是這樣的:主播 -> CDN -> 觀眾
因此,直播出現卡頓,三個端都可能是問題的源頭: 1. 主播端的網路不好,導致推流上行不穩定 2. 服務端的線路質量不好,導致分發不穩定 3. 觀眾端的網路不好,導致拉流下行不穩定
那麼,我們如何確切地判斷是哪一個環節出了問題導致的播放卡頓呢 ?
如何判斷主播網路不好
主播端網路不好,直接影響到的就是千千萬萬的觀眾,因此,如果發現所有的觀眾都出現頻繁卡頓,那麼多半就是主播端的問題了。
頻寬測試 用頻寬測試工具http://www.speedtest.net/ 測試下主播的頻寬,如果主播的上行頻寬明顯小於推流的位元速率,那麼肯定會出現推流幀率不穩定。
統計回撥 一般的推流 SDK 都會統計主播推流的實時視訊幀率,如果預設的幀率是 20 fps,但是實際的幀率低得很多,比如 5 fps,排除手機效能低的原因的話,多半也是網路頻寬不足引起的。
CDN 廠商給出的後臺統計 比如,七牛直播雲就給我們的每一個客戶提供瞭如下的後臺 Portal 介面,可以用於監控每一個主播的實時推流情況:
從這個圖來看,該主播的推流上行其實還是蠻穩定的,一直在 20 fps 左右。
如何判斷觀眾端網路不好
觀眾是整個直播的終端環節,一般如果不是大面積的觀眾出現卡頓,那麼很可能是這個觀眾自身的網路問題,可以考慮切換到別的 WiFi 網路,或者 4G 下播放試試,我們還可以通過如下手段,具體確認下是網路的原因。
1. 頻寬測試 跟主播端類似,我們依然可以用頻寬測試工具,測試下觀眾端的頻寬,如果該觀眾的頻寬明顯低於主播的推流位元速率,那麼肯定會出現卡頓。
- 網路質量測試 可以在觀眾端的網路下,ping 一下播放域名,看看當前丟包率是多少,一般好的網路,ping 值的丟包率是 0%。
當然,還有一些更加專業的網路效能測試工具,如 iperf,這裡就不展開詳細的介紹了。
- 如何判斷 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 獲取最新的文章和資訊。
相關文章
- 直播疑難雜症排查 — 序
- 《直播疑難雜症排查系列》之一 :播放失敗
- 《直播疑難雜症排查》之十:直播功耗高
- 《直播疑難雜症排查》之三:首開慢
- 《直播疑難雜症排查》之五: 音畫不同步
- 如何在直播中解決黑屏、花屏、閃屏問題 | 直播疑難雜症排查
- android 疑難雜症Android
- SpringCloud疑難雜症SpringGCCloud
- docker的疑難雜症Docker
- 遊戲研發疑難雜症(3)遊戲
- 如何解決直播中雜音、噪音和回聲問題 | 直播疑難雜症安排
- 程式疑難雜症之1快取快取
- TCP協議疑難雜症全景解析TCP協議
- 【故障排查】10分鐘解決Quartz重複排程的疑難雜症quartz
- 淺析TCP協議中的疑難雜症TCP協議
- Android 蹲坑的疑難雜症集錦一Android
- Ask Tom!解決你的Oracle疑難雜症Oracle
- 通透,23 個問題 TCP 疑難雜症全解析TCP
- GPDB-疑難雜症-使用資源組入庫OOMOOM
- 一頁解決字串常量池相關疑難雜症字串
- 4/25蝦皮面試準備 Hadoop疑難雜症面試Hadoop
- Flutter 疑難雜症系列:實現中文文字的垂直居中Flutter
- Android 蹲坑的疑難雜症集錦(兼 Gradle) 二AndroidGradle
- 只需兩個函式終結狀態列疑難雜症函式
- 遊戲研發疑難雜症(4)摳細節成死結遊戲
- 疑難雜症1-去掉網站裡的特殊編碼網站
- 這篇文章,專治MQ中介軟體各種疑難雜症MQ
- 阿里雲 ANT DESIGN PRO 開發筆記 - 疑難雜症阿里筆記
- 【H5疑難雜症】脫離文件流時的渲染BUGH5
- 技巧: 使用truss、strace或ltrace診斷軟體的"疑難雜症"
- 前端除錯:記Iscroll4 疑難雜症之z-index失效前端除錯Index
- Flutter 疑難雜症系列:鍵盤原理及常見問題解決方案Flutter
- R8疑難雜症分析實戰 - 類反射篇|得物技術反射
- iOS 疑難雜症 — — UITableView 新增 tableFooterView 旋轉螢幕後收不到點選事件!!!...iOSUIView事件
- Ubuntu18.04 顯示卡驅動安裝(解決各種疑難雜症)Ubuntu
- SQL疑難雜症【2】解決SQL訂閱過程中找不到已經建立的訂閱SQL
- 遊戲研發疑難雜症:1000萬夠做遊戲,為何3000萬不夠?遊戲
- Flutter雜症(InkWell,TextField)Flutter