播放器技術分享(5):延時優化
搞音視訊開發好些年,分享過許多部落格文章,比如:前幾年釋出的《FFmpeg Tips》系列,《Android 音訊開發》系列,《直播疑難雜症排查》系列等等。最近想把多年來開發和優化播放器的經驗也分享出來,希望能幫助到音視訊領域的初學者。第一期文章要推出的內容主要涉及到播放器比較核心的幾個技術點,大概的目錄如下:
5. 播放器技術分享(5):延時優化
本篇是系列文章的第五篇,主要聊一聊如何優化播放延時。由於播放的延時,是需要從 “視訊的生產 -> 分發 -> 播放” 各個環節聯合優化的,並不是單一靠播放器就可以搞定的,因此,本文會更多地介紹一些整體上的延時原因和優化思路,而不是單講播放器本身如何解決延時問題。
播放一般分為 2 種,一種是實時流的直播,如:網紅直播、賽事直播、衝頂大會、安防攝像頭監控等,另一種是視訊檔案的線上點播,如:線上電影電視劇,教育培訓視訊,直播回放等。只有面對直播的場景,才有對降低延時的訴求。
1 延時的測量
要優化播放延時,首先要知道如何測量延時,目前行業內有多種方法,簡單介紹如下:
1.1 線上秒錶
主播端對著北京時間/秒錶,然後對比播放器畫面中顯示的時間與北京時間/秒錶的差值,這是最常用的測量手法。
1.2 SEI 幀
SEI 全稱是補充增強資訊(Supplemental Enhancement Information),提供了一種向視訊碼流中加入額外資訊的方法,是 H.264/H.265 等視訊壓縮標準的特性之一。
如圖所示,我們可以在流媒體伺服器端(或者主播端),定時插入一些 SEI 幀,裡面記錄當前的 NTP 標準時間,當播放器收到 SEI 幀之後,提取出 SEI 幀的時間,跟當前的系統時間對比,即可得到延時差。
1.3 音訊波形
如圖所示,主播端和播放器端,在同一個時刻開始把音訊資料寫入檔案中,然後對比兩份檔案的音訊波形,即可測量出延時差。這個 “同一時刻”,可以是通過訊息通知的方式,也可以約定一個共同的 NTP 時刻,或者是藉助 SEI 幀作為觸發的起始。
2 延時是怎麼產生的
影響播放延時的因素很多,這裡簡單列出來幾個:
1. 頻寬和傳輸距離
2. 網路抖動和擁塞控制
3. 服務端的 GOP 快取
4. 各個環節的緩衝區
5. HLS 協議的切片大小
6. 資料處理效能:如美顏、剪裁拉伸、編碼解碼、視訊渲染等
2.1 網路頻寬和傳輸距離
這是一個基礎概念,頻寬和傳輸距離對延時的影響至關重要,特別是國內跨省和跨運營商的出口頻寬限制等原因,會導致延時更大。這也是為啥近幾年邊緣儲存、邊緣計算等概念被提及得比較多,特別是在智慧安防監控場景,由於監控視訊的消費大都數在區域性地區,如果把視訊的儲存和多媒體/智慧處理均放在邊緣,可極大地提升效率和體驗。
2.2 網路抖動和擁塞控制
基於 TCP 協議的流媒體傳輸,對延時很不友好,因為 TCP 協議的很多特性導致延時不可避免地增大,比如:三次握手、丟包重傳、某些擁塞控制策略等,因此在網路頻繁抖動的弱網下,延時會比較大。
2.3 GOP 快取
如圖,上一篇講首開優化的時候,我們提到要在服務端快取一個 GOP 資料,當播放器申請碼流的時候,快速下發這個快取的 GOP,以實現秒開。
但是,播放器拿到的這段 GOP 資料,是一段歷史的 GOP 資料,而不是實時的資料,要播放完這段 GOP 快取資料是需要一段時間的,假設該直播的 GOP 大小是 5s,則直接會導致播放器的延時至少達到 5s
2.4 緩衝區
無論是推流端、還是分發端或者是播放器本身,都是會存在一些緩衝區的,以應對如網路、效能等抖動帶來的問題。
假設視訊的幀率是 30fps,那麼,每緩衝 30 幀,相當於帶來了 1s 的延時。由此可見,緩衝區帶來的延時是比較大的,是導致延時的最大因素之一。
2.5 HLS 切片
如果播放使用的是 HLS 協議,如圖所示,假設服務端按照 3~10s 為單位來切片生成 ts 檔案,則會直接導致播放的延時會達到 3~10s,這是該協議在延時方面的硬傷,如果對直播延時敏感,一般改用 RTMP 或者 HTTP-FLV 協議來拉直播流。
3 如何優化播放延時呢 ?
與首開優化的思路類似,要優化播放延時,關鍵就是從影響延時的各個因素入手,基本思路列表如下;
1. 網路線路優化
選擇優質的 CDN 加速服務,保障傳輸的網路頻寬和線路資源
測速選線,動態監測,智慧排程,確保每一路流的傳輸質量
2. 降緩衝區
生產端減小 GOP 大小,從而減少服務端 GOP 快取的大小
生產端根據傳送緩衝區情況,動態調整幀率、位元速率
播放端主動丟幀/追幀/倍數播放,加快緩衝區的消耗
3. 協議/傳輸優化
Based on TCP -> Based on UDP,如:QUIC,RTP/RTCP
傳輸策略優化:前向糾錯,丟包重傳策略,擁塞控制優化,關鍵幀請求等
4. 處理效能優化
硬體編解碼/美顏/渲染等處理
演算法效能調優
由於這裡的每一項優化,都需要較大的篇幅來闡述,網上也有許多相關的討論和文章,我就不展開講了,後面有機會再做深度分享。
4 總結
播放器的延時優化,就分享到這裡了,如有疑問的小夥伴歡迎來信 [email protected] 交流。另外,也歡迎大家關注我的新浪微博 @盧_俊 或者 微信公眾號 @Jhuster 獲取最新的文章和資訊。