做者:劉博
隨着直播的發展,直播實時互動性變得日益重要。又拍雲在 WebRTC 的基礎上,憑藉多年的開發經驗,結合當下實際狀況,開發 UPRTC 系統,解決了網絡延時、併發量大、客戶端解碼能力差等問題。git
2010年5月,Google 花費6820萬美圓收購擁有編解碼、回聲消除等技術的 GIPS 公司。以後谷歌開源了 GIPS 的技術,與相關機構 IETF 和 W3C 制定行業標準,組成了現有的 WebRTC 項目。
WebRTC 全稱 Web Real-Time Communication。它並非單一的協議, 包含了媒體、加密、傳輸層等在內的多個協議標準以及一套基於 JavaScript 的 API。經過簡單易用的 JavaScript API ,在不安裝任何插件的狀況下,讓瀏覽器擁有了 P2P音視頻和數據分享的能力。
同時WebRTC 並非一個孤立的協議,它擁有靈活的信令,能夠便捷的對接現有的SIP 和電話網絡的系統。github
成立UPRTC項目前,又拍雲通過多重調研和考慮,選擇了 WebRTC,主要有三個緣由:算法
WebRTC 是開源、 免專利費的項目, 大大節省了開發時間和成本;瀏覽器
WebRTC 由 Google 主導, 技術很是先進;安全
Safari 等瀏覽器以及其餘終端逐漸增強對 WebRTC 技術的支持。服務器
音視頻引擎:OPUS、VP8 / VP九、H264
傳輸層協議:底層傳輸協議爲 UDP
媒體協議:SRTP / SRTCP
數據協議:DTLS / SCTP
P2P 內網穿透:STUN / TURN / ICE / Trickle ICE
信令與 SDP 協商:HTTP / WebSocket / SIP、 Offer Answer 模型網絡
圖1爲 WebRTC 內部結構簡化圖,最底層是硬件設備,上面是音頻捕獲模塊和視頻捕獲模塊。
中間部分爲音視頻引擎。音頻引擎負責音頻採集和傳輸,具備降噪、回聲消除等功能。視頻引擎負責網絡抖動優化,互聯網傳輸編解碼優化。
在音視頻引擎之上是 一套 C++ API,在 C++ 的 API 之上是提供給瀏覽器的Javascript API。
架構
△ 圖1:WebRTC內部結構併發
圖2是 WebRTC 涉及到的協議棧,WebRTC 核心的協議都是在右側基於 UDP 基礎上搭建起來的。
其中,ICE、STUN、TURN 用於內網穿透, 解決了獲取與綁定外網映射地址,以及 keep alive 機制。
DTLS 用於對傳輸內容進行加密,能夠看作是 UDP 版的 TLS。因爲 WebRTC 對安全比較重視,這一層是必須的。分佈式
SRTP 與 SRTCP 是對媒體數據的封裝與傳輸控制協議。
SCTP 是流控制傳輸協議,提供相似 TCP 的特性,SCTP 能夠基於 UDP 上構建,在 WebRTC 裏是在 DTLS 協議之上。
RTCPeerConnection 用來創建和維護端到端鏈接,並提供高效的音視頻流傳輸。
RTCDataChannel 用來支持端到端的任意二進制數據傳輸。
△ 圖2:WebRTC 協議棧
爲了使 WebRTC 協議更適用於實時互動直播,又拍雲在 WebRTC 協議的基礎上進行改造優化,搭建了又拍雲 UPRTC 。支持多種應用場景,包括一對1、一對多和多對多等應用場景。
傳統的 WebRTC 應用模式是 P2P 的, UPRTC 則是服務器中轉模式。
由於又拍雲擁有性能優異的 CDN 資源,將 WebRTC 改形成服務器中轉模式以後,採用徹底分佈式系統,部署到全國全部邊緣節點,經過內部加速網絡 UTUN 加速,將轉發、併發壓力轉移到服務端,保證 UPRTC 終端能夠承受更多路併發。
加入網絡擁塞自適應控制,較強的弱網適應能力。
以移動設備從 WIFI 網絡切換到 4G 網絡爲例,又拍雲服務器能夠察覺到帶寬變化,統計丟包和延時,進行動態碼率調整,保證在弱網環境下也能進行正常通話。
對底層開源組件優化改造,支持高併發業務場景。
又拍雲設計了一套靈活高效的業務信令,用於敏感信令鑑權。
圖3爲 UPRTC 技術組成:
媒體通道、數據通道,信令通道;
數據加密模塊;
碼率自適應控制模塊;
又拍雲加速網絡;
P2P打洞服務;
房間應用業務;
機器人(自動管理功能和互動功能)。
△ 圖3:UPRTC技術組成
雖然 WebRTC 源代碼相對成熟,可是在實際應用中依舊須要解決如下問題:
1.音頻處理過程當中消耗 CPU 太高;
2.音視頻不一樣步的BUG;
3.安卓端 WebRTC 源碼對H.264支持並不全面,僅默認支持高通的芯片;
4.服務端架構過程當中須要加入碼率自適應算法,動態控制總碼率帶寬在 2M 之內。
推薦參考文檔:
W3C API 相關文檔: https://github.com/w3c
IETF 協議相關文檔: https://datatracker.ietf.org