Ⅰ WebRTC介紹
1、 WebRTC是什麼?
2、 WebRTC能做什麼?
3、 常用API
4、 基本原理
WebRTC全稱是Web Real-Time communication,是一種實時音視頻通訊技術,通過WebRTC可以使瀏覽器之間建立點對點的連接,並實時傳輸數據。
通過上述圖片可以看到【瀏覽器M】和【瀏覽器L】可以在不依余信老賴於Web伺服器的情況下點對點實時傳輸數據。上圖中的Web伺服器不是用於數據傳輸,而是用於協助【瀏覽器M】和【瀏覽器L】進行連接,進行協助連接的伺服器也叫【信令伺服器】。
WebRTC主要分為四部分,分別是信令、建立連接、安全加密、數據傳輸,下面分別介紹四個步驟。
信令是指通信兩端基於交換的數據進行協商。通俗的解釋就是在互聯網中兩個瀏覽器之間如果要進行點對點的數據傳輸,連接雙方需要交換對方的一些基本信息,基本信息包括對方的地址,帶寬,數據的編解碼格式,是否支持音視頻等等信息。
通信雙方的基本信息完成交換後,瀏覽器雙方開始坦洞建立連接。在網路中,瀏覽器雙方可能在同一個內網,可能不在同一個內網,中間可能還隔著交換機、路由器,還會存在防火牆。在網路的環境復雜的情況下,通信的雙方需要找到一條最佳路徑傳輸數據建立連接。建立連接主要使用的協議就是ICE協議。【ICE協議】又需要依賴【STUN協議】和【TURN協議】。
在WebRTC中,為了保證媒體傳輸的安全性,引入了【DTLS】作為傳輸加密協議,DTLS原理和作用類似於SSL/TLS,【DTLS】主要適用於UDP通信過程的加密,SSL/TLS主要適用於TCP通信過程的加密。
在WebRTC中,音視頻數據傳輸是使用RTP協議,然後通過 DTLS 協商出加密密鑰之後,RTP 也需要升級為 SRTP,通過密鑰加密後進行通信。協議棧如下圖所示:
上面說了對數據加密是使用DTLS,傳輸數據則分為兩種情況,一種是傳輸音視頻數據,另一種是傳輸自定義應用數據。
1、音視頻數據傳輸,主要使用RTP/SRTP、RTCP/SRTCP協議
前面主要對WebRTC做了一個簡單介紹,跳過了很多細節,有些地方可能不夠嚴謹,如果有興趣的讀者,可以對技術做進一步研究,比如:
1、信令如何進行協商?
2、傳輸層用了UDP,UDP本身是不豎升可靠的,那麼,音視頻數據、自定義用戶數據的時序、質量是如何保證的?
3、RTP用來傳遞音視頻數據,為什麼還需要有RTCP?
4、SCTP如何從協議層面兼顧傳輸的效率和質量?如何實現自定義數據的高效傳遞?
5、ICE協議的完整流程。
6、其他。
Ⅱ WebRTC 的音頻網路對抗概述
WebRTC 音頻數據處理中,期望可以實現音頻數據處理及傳輸,延時低,互動性好,聲音平穩無抖動,碼率低消耗帶寬少等。在數據傳輸上,WebRTC 採用基於 UDP 的 RTP/RTCP 協議,RTP/RTCP 本身不提供數據的可靠傳輸及質量保障。公共互聯網這種分組交換網路,天然具有數據包傳輸的丟失、重復、亂序及延時等問題。WebRTC 音頻數據處理的這些目標很難同時實現,WebRTC 的音頻網路對抗實現中針對不同情況對這些目標進行平衡。
這里更仔細地看一下 WebRTC 音頻數據處理管線,並特別關注與音頻網猜桐絡對抗相關的邏輯。
前面在 WebRTC 的音頻數據編碼及發送控制管線 一文中分析了 WebRTC 的音頻數據編碼及發送控制相關邏輯,這里再來看一下穗鉛坦 WebRTC 的音頻數據接收及解碼播放過程。
WebRTC 的音頻數據接收處理的概念抽象層面的完整流程大體如下:
對於 WebRTC 的音頻數據接收處理過程, webrtc::AudioDeviceMole 負責把聲音 PCM 數據通過系統介面送進設備播放出來。 webrtc::AudioDeviceMole 內部一般會起專門的播放線程,由播放線程驅動整個解碼播放過程。 webrtc::AudioTransport 作為一個適配和膠水模塊,它把音頻數據播放和 webrtc::AudioProcessing 的音頻數據處理及混音等結合起來,它通過 webrtc::AudioMixer 同步獲取並混音各個遠端音頻流,這些混音之後的激檔音頻數據除了返回給 webrtc::AudioDeviceMole 用於播放外,還會被送進 webrtc::AudioProcessing ,以作為回聲消除的參考信號。 webrtc::AudioMixer::Source / webrtc::AudioReceiveStream 為播放過程提供解碼之後的數據。RTCP 反饋在 webrtc::AudioMixer::Source / webrtc::AudioReceiveStream 中會通過 webrtc::Transport 發送出去。 webrtc::Transport 也是一個適配和膠水模塊,它通過 cricket::MediaChannel::NetworkInterface 實際將數據包發送網路。 cricket::MediaChannel 從網路中接收音頻數據包並送進 webrtc::AudioMixer::Source / webrtc::AudioReceiveStream 。
如果將音頻數據接收處理流水線上的適配和膠水模塊省掉,音頻數據接收處理流水線將可簡化為類似下面這樣:
webrtc::AudioMixer::Source / webrtc::AudioReceiveStream 是整個過程的中心,其實現位於 webrtc/audio/audio_receive_stream.h / webrtc/audio/audio_receive_stream.cc ,相關的類層次結構如下圖:
在 RTC 中,為了實現交互和低延遲,音頻數據接收處理不能只做包的重排序和解碼,它還要充分考慮網路對抗,如 PLC 及發送 RTCP 反饋等,這也是一個相當復雜的過程。WebRTC 的設計大量採用了控制流與數據流分離的思想,這在 webrtc::AudioReceiveStream 的設計與實現中也有體現。分析 webrtc::AudioReceiveStream 的設計與實現時,也可以從配置及控制,和數據流兩個角度來看。
可以對 webrtc::AudioReceiveStream 執行的配置和控制主要有如下這些:
對於數據流,一是從網路中接收到的數據包被送進 webrtc::AudioReceiveStream ;二是播放時, webrtc::AudioDeviceMole 從 webrtc::AudioReceiveStream 獲得解碼後的數據,並送進播放設備播放出來;三是 webrtc::AudioReceiveStream 發送 RTCP 反饋包給發送端以協助實現擁塞控制,對編碼發送過程產生影響。
webrtc::AudioReceiveStream 的實現中,最主要的數據處理流程 —— 音頻數據接收、解碼及播放過程,及相關模塊如下圖:
這個圖中的箭頭表示數據流動的方向,數據在各個模塊中處理的先後順序為自左向右。圖中下方紅色的框中是與網路對抗密切相關的邏輯。
webrtc::AudioReceiveStream 的實現的數據處理流程中,輸入數據為音頻網路數據包和對端發來的 RTCP 包,來自於 cricket::MediaChannel ,輸出數據為解碼後的 PCM 數據,被送給 webrtc::AudioTransport ,以及構造的 RTCP 反饋包,如 TransportCC、RTCP NACK 包,被送給 webrtc::Transport 發出去。
webrtc::AudioReceiveStream 的實現內部,音頻網路數據包最終被送進 NetEQ 的緩沖區 webrtc::PacketBuffer 里,播放時 NetEQ 做解碼、PLC 等,解碼後的數據提供給 webrtc::AudioDeviceMole 。
這里先來看一下, webrtc::AudioReceiveStream 實現的這個數據處理流水線的搭建過程。
webrtc::AudioReceiveStream 實現的數據處理管線是分步驟搭建完成的。我們圍繞上面的 webrtc::AudioReceiveStream 數據處理流程圖 來看這個過程。
在 webrtc::AudioReceiveStream 對象創建,也就是 webrtc::voe::(anonymous namespace)::ChannelReceive 對象創建時,會創建一些關鍵對象,並建立部分對象之間的聯系,這個調用過程如下:
webrtc::AudioReceiveStream 通過 webrtc::Call 創建,傳入 webrtc::AudioReceiveStream::Config,其中包含與 NACK、jitter buffer 最大大小、payload type 與 codec 的映射相關,及 webrtc::Transport 等各種配置。
webrtc::voe::(anonymous namespace)::ChannelReceive 對象的構造函數如下:
webrtc::voe::(anonymous namespace)::ChannelReceive 對象的構造函數的執行過程如下:
圖中標為綠色的模塊為這個階段已經接入 webrtc::voe::(anonymous namespace)::ChannelReceive 的模塊,標為黃色的則為那些還沒有接進來的模塊;實線箭頭表示這個階段已經建立的連接,虛線箭頭則表示還沒有建立的連接。
在 ChannelReceive 的 () 函數中, webrtc::PacketRouter 被接進來:
這個操作也發生在 webrtc::AudioReceiveStream 對象創建期間。 ChannelReceive 的 () 函數的實現如下:
這里 webrtc::PacketRouter 和 webrtc::MoleRtpRtcpImpl2 被連接起來,前面圖中標號為 5 的這條連接也建立起來了。NetEQ 在需要音頻解碼器時創建音頻解碼器,這個過程這里不再贅述。
這樣 webrtc::AudioReceiveStream 內部的數據處理管線的狀態變為如下圖所示:
webrtc::AudioReceiveStream 的生命周期函數 Start() 被調用時, webrtc::AudioReceiveStream 被加進 webrtc::AudioMixer :
這樣 webrtc::AudioReceiveStream 的數據處理管線就此搭建完成。整個音頻數據處理管線的狀態變為如下圖所示:
WebRTC 音頻數據接收處理的實現中,保存從網路上接收的音頻數據包的緩沖區為 NetEQ 的 webrtc::PacketBuffer ,收到音頻數據包並保存進 NetEQ 的 webrtc::PacketBuffer 的過程如下面這樣:
播放時, webrtc::AudioDeviceMole 最終會向 NetEQ 請求 PCM 數據,此時 NetEQ 會從 webrtc::PacketBuffer 中取出數據包並解碼。網路中傳輸的音頻數據包中包含的音頻采樣點和 webrtc::AudioDeviceMole 每次請求的音頻采樣點不一定是完全相同的,比如采樣率為 48kHz 的音頻, webrtc::AudioDeviceMole 每次請求 10ms 的數據,也就是 480 個采樣點,而 OPUS 音頻編解碼器每個編碼幀中包含 20ms 的數據,也就是 960 個采樣點,這樣 NetEQ 返回 webrtc::AudioDeviceMole 每次請求的采樣點之後,可能會有解碼音頻數據的剩餘,這需要一個專門的 PCM 數據緩沖區。這個數據緩沖區為 NetEQ 的 webrtc::SyncBuffer 。
webrtc::AudioDeviceMole 請求播放數據的大體過程如下面這樣:
更加仔細地審視 WebRTC 的音頻數據處理、編碼和發送過程,更完整地將網路對抗考慮進來, WebRTC 的音頻數據處理、編碼和發送過程,及相關模塊如下圖:
在 WebRTC 的音頻數據處理、編碼和發送過程中,編碼器對於網路對抗起著巨大的作用。WebRTC 通過一個名為 audio network adapter (ANA) 的模塊,根據網路狀況,對編碼過程進行調節。
pacing 模塊平滑地將媒體數據發送到網路,擁塞控制 congestion control 模塊通過影響 pacing 模塊來影響媒體數據發送的過程,以達到控制擁塞的目的。
由 WebRTC 的音頻採集、處理、編碼和發送過程,及音頻的接收、解碼、處理及播放過程,可以粗略梳理出 WebRTC 的音頻網路對抗的復雜機制:
沒看到 WebRTC 有音頻帶外 FEC 機制的實現。
參考文章
干貨|一文讀懂騰訊會議在復雜網路下如何保證高清音頻
Done.
Ⅲ webrtc伺服器需要多少帶寬
根據 webrtc-experiment ,opus的最小帶寬為6kbit/s,vp8的最小帶寬為100kbit/s.因此,總的速度為106kbit/s。【點擊免費試用,0成本啟動】
webrtc中的帶寬自適應演算法分為兩種:
1、發端帶寬控制,原理是由rtcp中的丟包統計來動態的增加或減少帶寬,在減少帶寬時使用TFRC演算法來增加平滑度。
2、收端帶寬估算,原理是並由收到rtp數據,估出帶寬;用卡爾曼濾波,對每一幀的發送時間和接收時間進行分析,從而得出網路帶寬利用情況,修正估出的帶寬。兩種演算法相輔相成,收端將估算的帶寬發送給發端,發端結合收到的帶寬以及丟包率,調整發送的帶寬。
想要了解更多關於webrtc的相關信息,推薦咨詢ZEGO即構科技。即構科技有限公司是為開發者提供高品質實時音視頻、實時語音、互動直播和IM即時通訊等服務的公司。核心團隊成員均來自QQ,有超過20年的互聯網和音視頻技術開發經驗,以及億量級海內外用戶運營服務能力。專注於實時音視頻領域,致力提供全世界范圍內最清晰穩定實時的語音視頻服務,已服務4000+企業,適用於游戲、娛樂社交、在線教育、在線醫療、遠程會議、智能硬體等多種用戶場景。
Ⅳ WebRTC簡介(一)
WebRTC(Web Real-Time Communication)也被稱為網路實時通信,是由 Google、Mozilla 和其他公司推動的一個開源項目,它通過 Javascript API 實現無插件的實時通信,以及在不需要中介的情況下在瀏覽器之間交換任意數據。
WebRTC的優點:
WebRTC技術的誕生,有一個很重要的原因在於,在瀏覽器實現實時音視頻通話,需要依賴相關插件或程序,而插件安全漏洞問題則更為關鍵。瀏覽器開發人員無法控制這些插件以及更新,因此插件帶來的安全風險也相對較大。
在WebRTC誕生之前,開發實時音視頻應用的成本是非常高,需要考慮的技術問題很多,如音視頻的編解碼,數據傳輸延時、丟包、網路抖動、迴音處理和消除等,如果要兼容瀏覽器端的實時音視頻通信,還需要額外安裝插件。當然,可以考慮使用第三方成熟技術,比和旦並如當時世界頂級的互聯網音視頻方案GIPS(Global IP Solutions),支付相應的費用就行。很多知名的應用或者軟體服務商也都在用GIPS,如Yahoo,AOL,IBM,SKYPE,QQ等。
WebRTC項目的願景:實時通信web化,讓WebRTC成為互聯網音視頻實時通信的規范,讓開發者基於此規范快速開發出安全、可靠的應用。未來的音視頻實時通信,必定是現代化生產活動中極其重要的板塊。以下是WebRTC的部分應用場景:
兩個不同網路環境的(具備攝像頭/麥克風多媒體設備的)客戶端(瀏覽器或APP),要實現點對點的實時音視頻對話,難點在哪裡?
要實現P2P通信,首先需要了解彼此是否都支持相同的媒體能力,WebRTC默認使用V8編解碼器,如果要連接的對方不支持V8解碼,如果沒有媒體協商過程。那麼即使連接成功,把視頻數據發給對方,對方也無法播放
比喚跡如:Peer-A端可支持VP8、H264多種編碼格式,而Peer-B端支持VP9、H264,要保證二端都正確的編解碼,最簡單的辦法就是取它們的交集H264
有一個專門的協議 ,稱為Session Description Protocol (SDP),可用於描述上述這類遲喚信息,在WebRTC中,參與視頻通訊的雙方必須先交換SDP信息,這樣雙方才能知根知底,而交換SDP的過程,也稱為"媒體協商"。
交換數據會通過一個中間服務來完成,在這里,我們稱之為信令伺服器
在建立P2P連接時,需要交換的信息有:
最理想的場景
然而,在大多數情況下,兩個對等端都是各自處於某個區域網之中,相互之間隔著NAT與防火牆
NAT(Network Address Translation)即為網路地址轉換協議
區域網-->公網
公網-->區域網
可以藉助STUN伺服器.,穿越NAT
在NAT四種主要類型中有三種是可以使用STUN穿透:完全圓錐型NAT、受限圓錐型NAT和埠受限圓錐型NAT。但大型公司網路中經常採用的對稱型 NAT(又稱為雙向NAT)則不能使用STUN穿透,這類路由器會透過 NAT 布署所謂的「Symmetric NAT」限制。也就是說,路由器只會接受之前連線過的節點所建立的連線。
可以點對點連接的情況與需要中轉的情況(數據來源於Google)
不過在國內大部分區域網無法穿越。
Ⅳ WebRTC概念簡介
WebRTC(Web Real-Time Communication)。Real-Time Communication,實時通訊。
WebRTC能讓web應用和站點之間選擇性地分享音視頻流。在不安裝其它應用和插件的情況下,完成點對點通信。
WebRTC背後的技術被實現為一個開放的Web標准,並在所有主要瀏覽器中均以常規JavaScript API的形式提供。對於客戶端(例如Android和iOS),可以使用提供相同功能的庫。 WebRTC是個 開源項目 ,得到Google,Apple,Microsoft和Mozilla等等公司的支持。2011年6月1日開源並在Google、Mozilla、Opera支持下被納入萬維網聯盟的W3C推薦標准。
WebRTC包括一系列API和相互關聯的協議來實現通信。
Voice over Internet Protocol,在網路上傳輸聲音消息的技術。
例如網路音頻通話。或者叫做IP電話,寬頻電話。使用VoIP技術的一大原因是費用低。
Network address translation,網路地址轉換。
NAT能給你的設備一個公共IP地址。一個路由器(router)有一個公共IP地址,每個連接到路由的設備有一個私有的IP地址。
設備發送請求時,會從一個特定埠,通過私有IP發送到路由的公共IP。這樣每個設備在網上不需要都有一個公共IP地址,但也能被其它設備發現。
參考 IP Network Address Translator (NAT) Terminology and Considerations
Interactive Connectivity Establishment,互動式連接建立(互動式連通性建立)。
ICE是一套能讓web瀏覽器之間互相連接的框架。通常來說,節點A到B是很難直接相連的。防火牆會阻止連接,設備沒有公共IP地址,路由不允許直接連接其他節點。
ICE使用STUN或者TURN服務(或者同時使用兩者)來建立連接。
參考 ICE | rfc8445
Session Traversal Utilities for NAT (STUN) ,NAT會話傳輸工具。
STUN協議能發現告握辯客戶端(節點)的公共地址。客戶端發送一個請求給網上的STUN伺服器,伺服器返回客戶端的公共地址。不管客戶端在路由器的NAT後能否可達。襪缺
STUN為請求者提供了可公開訪問的IP地址,它就不再參與對話了。
有些路由器會限制設備與外面其它設備的連接。這意味著即使STUN伺服器知道了路由的公共IP地址,也沒法建立連接。
這種情況下我們需要使用 TURN 。
Traversal Using Relays around NAT,使用中繼繞過NAT傳輸。
一些路由器使用一種叫「Symmetric NAT」(對稱型NAT)的限制。這意味著路由器僅允許之前皮猜連接過的節點(peer)來建立連接。
STUN 提供了一個能讓應用(終端,節點)穿過NAT的方法。STUN允許客戶端獲得一個傳輸地址(一個IP和埠)來獲取其它節點的數據。
然而STUN獲取到的地址不一定能被所有節點使用。這些地址是否可用取決於網路拓撲的情況。所以,單獨STUN無法提供完整的穿越NAT的方案。
TURN協議允許兩個處於NAT環境的主機利用中繼進行通訊。客戶端能夠在TURN伺服器上分配資源,與其它客戶端(peer)進行通訊。
客戶端關聯一個TURN伺服器的地址(relayed server address)來作為中繼。
客戶端發送報文給TURN服務,TURN服務使用relayed server address作為源地址向其他客戶端中繼轉發報文。
穿越NAT,這個過程就像是「打洞」。也有人稱TURN伺服器為「打洞伺服器」。
這么看,TURN伺服器需要有大的帶寬。因此,ICE會優先考慮直接通訊,無法直接通訊情況下會使用TURN。
參考 TURN rfc8656
Session Description Protocol,會話描述協議。
描述多媒體連接內容的協議。例如解析度,格式,編碼,加密演算法等等。
實際上,SDP不是個真正的協議。它也是用來描述設備之間連接與傳輸多媒體的數據格式。
參考 SDP: Session Description Protocol | rfc8866
一些縮寫
更多請參考 WebRTC概念簡介
Ⅵ WebRTC(四)流媒體傳輸技術
WebRTC作為一個實時音視頻傳輸技術,實時性是RTC技術的主要評判標准。在整個實時音視頻系統中,對實時性影響最大的就是傳輸層。當今通信技術眾多,但是都離不開兩個基礎的協議,即TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。
眾所周知,TCP協議是一個在不可靠的網路上扮羨提供可靠的端對端數據傳輸協議。為了可靠性,TCP有三次握手、超時重傳、流量控制和擁塞控制等機制,這些都都打打影響到了實時性。
雖然UDP不是可靠的傳輸協議,但是卻保證了實時性,並且有極高的自由度。因此WebRTC技術中傳輸層採用的基於UDP協議的RTP協議(Real-time Transport Protocol,實時傳輸協議)。
由於UDP是無序傳輸的,因此RTP協議主要的作用是記錄UDP包的序號,方便應用層後續的操作。RTP協議的規范敬缺弊如下圖所示。
下面將按照從左到右從上到下的順序介紹各個欄位的具體含義:
RTCP(Real-Time Transport Control Protocol),即實時傳輸控制協議,它用於為RTP協議的服務質量提供保障,在傳輸層對音視頻流進行同步並且檢測網路質量。在進行RTP會話時,發送方和接收方都會周期性地發送RTCP包,該包中包含了已發送的數據包的數量和丟失包的數量等信息。由於RTCP包只包含一些控制信息,因此包的容量比較小,多個RTCP包可以跟隨一個UDP一起傳輸。
RTCP有五種分組類型:
綜上所述,RTC協議可以保證數據傳輸的實時性亮族,RTCP協議可以保證數據傳輸的可靠性,WebRTC 將上述兩個協議進行配合使用的確能在較小的開銷內取得優秀的傳輸效率。