1. 程式人生 > >播放器技術分享(5):延時優化

播放器技術分享(5):延時優化

搞音視訊開發好些年,分享過許多部落格文章,比如:前幾年釋出的《FFmpeg Tips》系列,《Android 音訊開發》系列,《直播疑難雜症排查》系列等等。最近想把多年來開發和優化播放器的經驗也分享出來,希望能幫助到音視訊領域的初學者。第一期文章要推出的內容主要涉及到播放器比較核心的幾個技術點,大概的目錄如下:

1.  播放器技術分享(1):架構設計

2. 播放器技術分享(2):緩衝區管理

3. 播放器技術分享(3):音畫同步

4. 播放器技術分享(4):首開時間

5. 播放器技術分享(5):延時優化

本篇是系列文章的第五篇,主要聊一聊如何優化播放延時。由於播放的延時,是需要從 “視訊的生產 -> 分發 -> 播放” 各個環節聯合優化的,並不是單一靠播放器就可以搞定的,因此,本文會更多地介紹一些整體上的延時原因和優化思路,而不是單講播放器本身如何解決延時問題。

播放一般分為 2 種,一種是實時流的直播,如:網紅直播、賽事直播、衝頂大會、安防攝像頭監控等,另一種是視訊檔案的線上點播,如:線上電影電視劇,教育培訓視訊,直播回放等。只有面對直播的場景,才有對降低延時的訴求。

1 延時的測量

要優化播放延時,首先要知道如何測量延時,目前行業內有多種方法,簡單介紹如下:

1.1 線上秒錶

image.png

主播端對著北京時間/秒錶,然後對比播放器畫面中顯示的時間與北京時間/秒錶的差值,這是最常用的測量手法。

1.2 SEI 幀

image.png

SEI 全稱是補充增強資訊(Supplemental Enhancement Information),提供了一種向視訊碼流中加入額外資訊的方法,是 H.264/H.265 等視訊壓縮標準的特性之一。

如圖所示,我們可以在流媒體伺服器端(或者主播端),定時插入一些 SEI 幀,裡面記錄當前的 NTP 標準時間,當播放器收到 SEI 幀之後,提取出 SEI 幀的時間,跟當前的系統時間對比,即可得到延時差。

1.3 音訊波形

image.png

如圖所示,主播端和播放器端,在同一個時刻開始把音訊資料寫入檔案中,然後對比兩份檔案的音訊波形,即可測量出延時差。這個 “同一時刻”,可以是通過訊息通知的方式,也可以約定一個共同的 NTP 時刻,或者是藉助 SEI 幀作為觸發的起始。

2 延時是怎麼產生的

影響播放延時的因素很多,這裡簡單列出來幾個:

1. 頻寬和傳輸距離

2. 網路抖動和擁塞控制

3. 服務端的 GOP 快取

4. 各個環節的緩衝區

5. HLS 協議的切片大小

6. 資料處理效能:如美顏、剪裁拉伸、編碼解碼、視訊渲染等

2.1 網路頻寬和傳輸距離

這是一個基礎概念,頻寬和傳輸距離對延時的影響至關重要,特別是國內跨省和跨運營商的出口頻寬限制等原因,會導致延時更大。這也是為啥近幾年邊緣儲存、邊緣計算等概念被提及得比較多,特別是在智慧安防監控場景,由於監控視訊的消費大都數在區域性地區,如果把視訊的儲存和多媒體/智慧處理均放在邊緣,可極大地提升效率和體驗。

2.2 網路抖動和擁塞控制

基於 TCP 協議的流媒體傳輸,對延時很不友好,因為 TCP 協議的很多特性導致延時不可避免地增大,比如:三次握手、丟包重傳、某些擁塞控制策略等,因此在網路頻繁抖動的弱網下,延時會比較大。

2.3 GOP 快取

image.png

如圖,上一篇講首開優化的時候,我們提到要在服務端快取一個 GOP 資料,當播放器申請碼流的時候,快速下發這個快取的 GOP,以實現秒開。

但是,播放器拿到的這段 GOP 資料,是一段歷史的 GOP 資料,而不是實時的資料,要播放完這段 GOP 快取資料是需要一段時間的,假設該直播的 GOP 大小是 5s,則直接會導致播放器的延時至少達到 5s

2.4 緩衝區

image.png

無論是推流端、還是分發端或者是播放器本身,都是會存在一些緩衝區的,以應對如網路、效能等抖動帶來的問題。

假設視訊的幀率是 30fps,那麼,每緩衝 30 幀,相當於帶來了 1s 的延時。由此可見,緩衝區帶來的延時是比較大的,是導致延時的最大因素之一。

2.5 HLS 切片

image.png

如果播放使用的是 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 獲取最新的文章和資訊。

weixin_jhuster.jpg