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