上海2017年5月17日電 /美通社/ -- 七牛直播云在2016年6月發(fā)布之后,幫助廣大客戶解決過形形色色的問題,如直播卡頓、馬賽克、花屏、黑屏、雜音、音畫不同步等等,這其中,有一些是網(wǎng)絡原因,有一些是開發(fā)者的使用姿勢問題,有一些是參數(shù)配置錯誤,當然,也有一些是 SDK 本身的問題。
總結下來,如果開發(fā)者能夠?qū)χ辈ヮI域的一些基礎知識有更深入的了解,掌握一些基本的排障手段,很多問題是能夠很快自行解決的,甚至也能夠更好地防患于未然。
因此,繼《直播技術詳解》系列文章之后,七牛云推出了這個新的系列《直播疑難雜癥排查》,會把協(xié)助客戶解決直播問題的經(jīng)驗逐步分享出來,同時也會穿插一些音視頻開發(fā)的基礎知識和優(yōu)化經(jīng)驗,希望能夠幫助到直播領域的開發(fā)者們。本文是《直播疑難雜癥排查》系列的第二篇文章,主要分析下如何排查播放卡頓問題。
播放卡頓的表現(xiàn)
播放卡頓的表現(xiàn)總結下來包括但不限于以下這些:頻繁出現(xiàn)緩沖、播放不夠流暢畫面一卡一卡的。
常見播放卡頓問題排查
從代碼層面來看,什么是卡頓?其實是指播放器渲染的幀率太低,比如:1s 顯示 3~5 幀,或者渲染完一幀后,過很久才渲染下一幀。
因此,我們需要排查,是什么原因?qū)е铝瞬シ牌鳠o法流暢地渲染數(shù)據(jù),通??赡苡腥缦聨状箢悾?/p>
原因一:網(wǎng)絡帶寬不足
一個完整的直播應用,簡單來說數(shù)據(jù)流是這樣的:主播 -> CDN -> 觀眾
因此,直播出現(xiàn)卡頓,三個端都可能是問題的源頭:主播端的網(wǎng)絡不好,導致推流上行不穩(wěn)定、服務端的線路質(zhì)量不好,導致分發(fā)不穩(wěn)定觀眾端的網(wǎng)絡不好,導致拉流下行不穩(wěn)定。
那么,我們?nèi)绾未_切地判斷是哪一個環(huán)節(jié)出了問題導致的播放卡頓呢?
如何判斷主播網(wǎng)絡不好
主播端網(wǎng)絡不好,直接影響到的就是千千萬萬的觀眾,因此,如果發(fā)現(xiàn)所有的觀眾都出現(xiàn)頻繁卡頓,那么多半就是主播端的問題了。
1. 帶寬測試
用帶寬測試工具http://www.speedtest.net/測試下主播的帶寬,如果主播的上行帶寬明顯小于推流的碼率,那么肯定會出現(xiàn)推流幀率不穩(wěn)定。
2. 統(tǒng)計回調(diào)
一般的推流 SDK 都會統(tǒng)計主播推流的實時視頻幀率,如果預設的幀率是 20 fps,但是實際的幀率低得很多,比如 5 fps,排除手機性能低的原因的話,多半也是網(wǎng)絡帶寬不足引起的。
3. CDN 廠商給出的后臺統(tǒng)計
比如,七牛直播云就給我們的每一個客戶提供了如下的后臺 Portal 界面,可以用于監(jiān)控每一個主播的實時推流情況:
從這個圖來看,該主播的推流上行其實還是蠻穩(wěn)定的,一直在 20 fps 左右。
如何判斷觀眾端網(wǎng)絡不好
觀眾是整個直播的終端環(huán)節(jié),一般如果不是大面積的觀眾出現(xiàn)卡頓,那么很可能是這個觀眾自身的網(wǎng)絡問題,可以考慮切換到別的 WiFi 網(wǎng)絡,或者 4G 下播放試試,我們還可以通過如下手段,具體確認下是網(wǎng)絡的原因。
1. 帶寬測試
跟主播端類似,我們依然可以用帶寬測試工具,測試下觀眾端的帶寬,如果該觀眾的帶寬明顯低于主播的推流碼率,那么肯定會出現(xiàn)卡頓。
2. 網(wǎng)絡質(zhì)量測試
可以在觀眾端的網(wǎng)絡下,ping 一下播放域名,看看當前丟包率是多少,一般好的網(wǎng)絡,ping 值的丟包率是 0%。
當然,還有一些更加專業(yè)的網(wǎng)絡性能測試工具,如 iperf,這里就不展開詳細的介紹了。
3. 如何判斷 CDN 線路不好
如果排除了主播端上行網(wǎng)絡原因以及觀眾端下行的網(wǎng)絡原因,那么,剩下的就很可能是 CDN 線路質(zhì)量原因了。
關于 CDN 線路質(zhì)量,一方面可以通過聯(lián)系 CDN 廠商來排查,另一方面,也可以通過播放端的打點上報,統(tǒng)計出各家 CDN 的線路質(zhì)量(比如:首開,卡頓率),分地區(qū)做一些線路的調(diào)整和優(yōu)化。
七牛實時流網(wǎng)絡(LiveNet)會根據(jù)網(wǎng)絡流量、各節(jié)點的連接、負載狀況及到用戶網(wǎng)絡的響應時間等綜合信息,實時地將用戶的請求調(diào)度到較佳服務節(jié)點上,同時可計算出較佳服務節(jié)點與視頻源節(jié)點的較佳網(wǎng)絡路徑,使用戶可以更快速的獲取到視頻內(nèi)容,提高視頻服務的響應速度和用戶體驗。
原因二:播放設備性能不足
越高清的碼率,對解碼的要求也越高,很多手機性能不足以支撐 720P 甚至 1080P 的視頻解碼,特別是很多低端的 Android 手機,因此導致實際解碼播放的幀率遠小于視頻碼流的實際幀率,從而產(chǎn)生卡頓。
解決這個問題的思路主要有如下幾個方面:
盡可能選擇使用硬解,充分利用 GPU 加速
如果有多種碼流,盡可能在低端機上選擇非高清碼流
增大緩沖區(qū),有助于緩解解碼不穩(wěn)定帶來的卡頓
原因三:視頻流時間戳問題
這個問題也遇到的比較多,特別是客戶自己寫的推流 SDK 或者碼流經(jīng)過一些轉(zhuǎn)碼處理后,沒有處理好音視頻時間戳從而產(chǎn)生的問題。播放器一般是嚴格根據(jù)碼流中的音視頻的時間戳來做音畫同步的,因此,如果碼流中的音視頻時間戳出現(xiàn)錯誤,肯定會影響到播放畫面的渲染時機。
例如,曾經(jīng)遇到一個流的時間戳信息如下:
可以看到,它的視頻時間戳出現(xiàn)了「回退」,而播放器一般 master 主時鐘是單調(diào)遞增的,當后來的視頻幀小于了當前的主時鐘,播放器就會做丟幀處理,從而導致播放的視頻幀率遠低于實際碼流中的視頻幀率,從而產(chǎn)生卡頓現(xiàn)象。