演講 / 黃開寧
整理 / 小極狗
前面(第一篇:webrtc閘道器伺服器搭建:開源技術vs自行研發)我給大家分享了:
第一,為什麼需要webrtc閘道器。對於即構來說,目前所使用的系統已經較為成熟,也經過了市場的檢驗,為什麼還要在如此成熟的商用系統中加入webrtc?
第二,webrtc通訊模型對比。分析了目前的webrtc通訊模型以及不同模型的適用場景,以便大家在選型時能結合自己的需求匹配對應的場景。
第三,開源vs自研。分享了目前市面上的一些開源系統及其特點以及即構自研webrtc閘道器的目的和出發點。
下面,我將結合即構自研的webrtc閘道器伺服器方案,分享在開發過程中遇到的難點和解決辦法。
在加入webrtc閘道器之前,即構自研系統架構如下圖所示,主要分成兩部分,左邊是低延時使用者,而右邊是圍觀使用者。低延時使用者主要是通過zego的實時傳輸網路進行推拉流。
由於rtmp的實時性並不是很好,在瀏覽器端沒有辦法通過rtmp進行上行傳輸達到低延時的特點,所以即構對原有的系統架構進行了公升級,在低延時的實時傳輸網路中加入了webrtc閘道器伺服器,具體如下圖所示。
在開發webrtc閘道器的過程中,我們遇到了不少的難題。下面我將結合即構的方案給大家一一分享。
在評價乙個系統時,時間是非常重要的考量指標。大家會發現使用webrtc進行接入測試的時候速度非常慢,這是由於webrtc用到的ice流程非常複雜,導致耗時過長。在stun中,首先需要做ip的對映識別出內網的ip,然後根據需要進行協助打洞。為了減少接入時間,我們首先要去掉stun。
為什麼在有伺服器的情況下還需要打洞?從圖上可以看到在ice流程中,首先是左邊的瀏覽器發起了offer,接下來是信令階段,主要是sdp candidate的協商交換,隨後會進入連通性檢測。在ice標準中,需要answer方是要先發起binding request請求,假如在candidate的協商交換時沒有經過stun做ip的對映,那麼瀏覽器端的ip是內網位址。而gateway在雲端,對應的ip是公網的位址。很明顯,這種位址的不對稱會導致連通失敗。這也是為什麼需要打洞,或者是中間伺服器的原因。
通過整合去掉了stun伺服器後,只需要幾步簡單的連通性檢測,不需要再經過中間伺服器的**,所以即構的方案在連通時間上可以達到毫秒級。
在分布式的系統中,由於節點眾多,所以可能會出現nack風暴。
nack風暴是如何引發的?假設現在publish方需要將序列號為7、8、9的三個包傳輸到gateway1,閘道器只是做簡單的**。在傳輸過程中,發生了8號序列包丟失的狀況,這個時候閘道器會實時將7、9號序列包**給所有使用者,同時判定8號序列包丟失並給publish方傳送丟包重傳的nack請求。而下方的使用者在收到7、9號序列包時,同樣會發現8號序列包丟失並傳送nack請求。假設接入使用者有10萬,在序列包丟失時會瞬間產生10萬個重傳請求,這個就是nack風暴。
對於nack風暴,即構有幾個設想方案。
為了支援直播中大量的分發性需求,即構的方案採用的是h.264編譯碼,而不是webrtc中的vp8、vp9。因為如果使用vp8或者vp9的編譯碼格式,就必須在伺服器中進行轉碼,這樣會造成延時。另外,h.264是支援svc,類似分層編碼的能力,基於這些,即構選擇了h.264編碼格式。而在rtp協議裡面,包括頭和擴充套件協議,暫時沒有幀之間關聯性的描述,或者可以說webrtc沒有實現。由於分層編碼是基於幀的關聯性,所以說如果沒有層關係的描述,就沒有辦法區分幀之間的關係。
而vp9是支援分層編碼的,可以在網頁端或者是webrtc場景下進行編譯碼,因為編碼資訊中帶有pictureid資訊,可以直接分析出幀之間的關聯性。但是vp9的編碼開銷非常大,如果需要支援分層編碼的話開銷會更大,特別在移動端中效能還是比較差。分層編碼不僅是編碼端和解碼端的結合,更重要的是要和伺服器結合,在伺服器中根據不同使用者的頻寬情況選擇不同的碼流進行**,這樣可以顯著降低頻寬的需求。
以上為我的分享內容,謝謝大家!
WebRTC閘道器伺服器單埠方案實現
標準webrtc連線建立流程 這裡描述的是trickle ice過程,並且省略了通話發起與接受的信令部分。流程如下 1 webrtc a通過signal server sdp offer到webrtc b。webrtc b做完本地處理以後,通過 signal server sdp answer到a。...
WebRTC閘道器伺服器單埠方案實現
標準webrtc連線建立流程 這裡描述的是trickle ice過程,並且省略了通話發起與接受的信令部分。流程如下 1 webrtc a通過 signal server sdp offer到webrtc b。webrtc b做完本地處理以後,通過 signal server sdp answer到a...
WebRTC伺服器搭建
yum install y nodejs1.1 coturn環境yum install y openssl openssl devel 編譯安裝 coturn,分別以下順序執行 cd coturn configure make make install檢視 coturn 是否安裝成功 which t...