【OpenIM原創(chuàng)】簡(jiǎn)單輕松入門(mén) 一文講解WebRTC實(shí)現(xiàn)1對(duì)1音視頻通信原理

什么是 WebRTC ?

WebRTC(Web Real-Time Communication)是 Google于2010以6829萬(wàn)美元從 Global IP Solutions 公司購(gòu)買(mǎi)慷蠕,并于2011年將其開(kāi)源掸冤,旨在建立一個(gè)互聯(lián)網(wǎng)瀏覽器間的實(shí)時(shí)通信的平臺(tái)厘托,讓 WebRTC技術(shù)成為 H5標(biāo)準(zhǔn)之一。我們看官網(wǎng)(?https://webrtc.org)的介紹

其中:

? ?Web Real-Time Communications (WEBRTC) W3C 組織:定義瀏覽器 API稿湿。

? ?Real-Time Communication in Web-browsers (RTCWEB) IETF 標(biāo)準(zhǔn)組織:定義其所需的協(xié)議铅匹,數(shù)據(jù),安全性等手段饺藤。

簡(jiǎn)單來(lái)說(shuō)包斑,WebRTC是一個(gè)可以在 Web 應(yīng)用程序中實(shí)現(xiàn)音頻,視頻和數(shù)據(jù)的實(shí)時(shí)通信的開(kāi)源項(xiàng)目策精。在實(shí)時(shí)通信中舰始,音視頻的采集和處理是一個(gè)很復(fù)雜的過(guò)程。比如音視頻流的編解碼咽袜、降噪和回聲消除等丸卷,但是在 WebRTC 中,這一切都交由瀏覽器的底層封裝來(lái)完成询刹。我們可以直接拿到優(yōu)化后的媒體流谜嫉,然后將其輸出到本地屏幕和揚(yáng)聲器萎坷,或者轉(zhuǎn)發(fā)給其對(duì)等端。

點(diǎn)對(duì)點(diǎn)音視頻的難點(diǎn)

拋開(kāi)低延遲沐兰、流暢性哆档、回聲消除和海量并發(fā)這些難點(diǎn)不講,單純從功能來(lái)看住闯,打通通訊雙方的兩端瓜浸,讓彼此能正常視頻及通話(huà)比原,主要存在兩個(gè)問(wèn)題:

(1)網(wǎng)絡(luò)打通問(wèn)題--無(wú)公網(wǎng)IP無(wú)法直接通信

當(dāng)今互聯(lián)網(wǎng)到處存在著一些中間件(MIddleBoxes)插佛,如NAT和防火墻,導(dǎo)致兩個(gè)(不在同一內(nèi)網(wǎng))中的客戶(hù)端無(wú)法直接通信量窘。這些問(wèn)題即便是到了IPV6時(shí)代也會(huì)存在雇寇,因?yàn)榧词共恍枰狽AT,但還有其他中間件如防火墻阻擋了鏈接的建立蚌铜。

當(dāng)今部署的中間件大多都是在C/S架構(gòu)上設(shè)計(jì)的锨侯,其中相對(duì)隱匿的客戶(hù)機(jī)主動(dòng)向周知的服務(wù)端(擁有靜態(tài)IP地址和DNS名稱(chēng))發(fā)起鏈接請(qǐng)求。大多數(shù)中間件實(shí)現(xiàn)了一種非對(duì)稱(chēng)的通訊模型冬殃,即內(nèi)網(wǎng)中的主機(jī)可以初始化對(duì)外的鏈接囚痴,而外網(wǎng)的主機(jī)卻不能初始化對(duì)內(nèi)網(wǎng)的鏈接,除非經(jīng)過(guò)中間件管理員特殊配置造壮。在中間件為常見(jiàn)的NAPT的情況下渡讼,內(nèi)網(wǎng)中的客戶(hù)端沒(méi)有單獨(dú)的公網(wǎng)IP地址,而是通過(guò)NAPT轉(zhuǎn)換耳璧,和其他同一內(nèi)網(wǎng)用戶(hù)共享一個(gè)公網(wǎng)IP成箫。這種內(nèi)網(wǎng)主機(jī)隱藏在中間件后的不可訪(fǎng)問(wèn)性對(duì)于一些客戶(hù)端軟件如瀏覽器來(lái)說(shuō)并不是一個(gè)問(wèn)題,因?yàn)槠渲恍枰跏蓟瘜?duì)外的鏈接旨枯,從某方面來(lái)看反而還對(duì)隱私保護(hù)有好處蹬昌。然而在P2P應(yīng)用中,內(nèi)網(wǎng)主機(jī)(客戶(hù)端)需要對(duì)另外的終端(Peer)直接建立鏈接攀隔,但是發(fā)起者和響應(yīng)者可能在不同的中間件后面皂贩,兩者都沒(méi)有公網(wǎng)IP地址。而外部對(duì)NAT公網(wǎng)IP和端口主動(dòng)的鏈接或數(shù)據(jù)都會(huì)因內(nèi)網(wǎng)未請(qǐng)求被丟棄掉昆汹。對(duì)于WebRTC來(lái)說(shuō)明刷,首先要解決的是如果跨越NAT實(shí)現(xiàn)內(nèi)網(wǎng)主機(jī)直接通訊的問(wèn)題。

(2)媒體格式編碼問(wèn)題--媒體格式編碼多樣不統(tǒng)一

對(duì)于需要音視頻通信的雙方满粗,彼此要了解對(duì)方支持的媒體格式才能正常地對(duì)流媒體編解碼辈末。比如,Peer-A端可支持VP8、H264多種編碼格式挤聘,而Peer-B端支持VP9轰枝、H264,要保證二端都正確的編解碼组去,最簡(jiǎn)單的辦法就是取它們的交集H264鞍陨。有一個(gè)專(zhuān)門(mén)的協(xié)議稱(chēng)為SDP(Session Description Protoco),可用于描述上述這類(lèi)信息从隆,在WebRTC中诚撵,參與視頻通訊的雙方必須先交換SDP信息,這樣雙方才能知根知底广料,而交換SDP的過(guò)程砾脑,也稱(chēng)為“媒體協(xié)商”

SDP(Session Description Protocol) 是一種會(huì)話(huà)描述協(xié)議幼驶,基于文本艾杏,其本身并不屬于傳輸協(xié)議,需要依賴(lài)其它的傳輸協(xié)議(比如 SIP 和 HTTP)來(lái)交換必要的媒體信息盅藻,用于兩個(gè)會(huì)話(huà)實(shí)體之間的媒體協(xié)商购桑。SDP(會(huì)話(huà)描述協(xié)議)定義了一個(gè)標(biāo)準(zhǔn),用于定義兩個(gè)(通常)端與端之間媒體(通常是流媒體)交換的參數(shù)氏淑。IETF已將其發(fā)布為RFC 4566勃蜘。SDP通常嵌入或封裝在另一個(gè)協(xié)議中,最廣泛使用的應(yīng)用程序位于大多數(shù)IP電話(huà)應(yīng)用程序的SIP協(xié)議內(nèi)部假残。簡(jiǎn)單地說(shuō)缭贡,SDP協(xié)議是媒體端到端對(duì)其接收規(guī)范和能力的聲明;典型的聲明會(huì)告訴我們:

(1)哪個(gè)IP地址準(zhǔn)備好接收傳入的媒體流

(2)哪個(gè)端口號(hào)正在偵聽(tīng)傳入的媒體流

(3)端點(diǎn)希望接收的媒體類(lèi)型(通常是音頻)

(4)端點(diǎn)希望在哪個(gè)協(xié)議中交換信息(通常為RTP)

(5)端點(diǎn)能夠解碼的壓縮編碼(編解碼器)

在一個(gè)典型的會(huì)話(huà)設(shè)置過(guò)程中辉懒,我們會(huì)看到兩個(gè)端點(diǎn)參與一個(gè)會(huì)話(huà)阳惹,其中每個(gè)端點(diǎn)發(fā)送一個(gè)SDP以通知另一個(gè)端點(diǎn)其規(guī)范和功能。SDP本身不提供任何媒體眶俩,但僅限于協(xié)商一組兼容的媒體交換參數(shù)莹汤;媒體流本身由不同的通道和協(xié)議處理。

一個(gè) SDP 的握手由一個(gè) offer 和一個(gè) answer 組成

WebRTC通話(huà)原理

點(diǎn)對(duì)點(diǎn)的雙方為了實(shí)現(xiàn)實(shí)時(shí)音視頻通信颠印, WebRTC需要解決媒體協(xié)商和網(wǎng)絡(luò)協(xié)商問(wèn)題纲岭,這里要引入信令服務(wù)器(Signaling Server)和STUN server


Signaling Server

需要通信的雙方之間建立WebRTC連接需要一個(gè)?信令服務(wù)器?來(lái)實(shí)現(xiàn)雙方通過(guò)網(wǎng)絡(luò)進(jìn)行連接。信令服務(wù)器的作用是作為一個(gè)中間人幫助雙方在盡可能少的暴露隱私的情況下建立連接线罕。WebRTC并沒(méi)有提供信令傳遞機(jī)制止潮,信令的傳遞和交換需要服務(wù)器參與,這個(gè)角色就是信令服務(wù)器钞楼。WebRTC信令指建立喇闸、控制和終止通信會(huì)話(huà)的過(guò)程以及業(yè)務(wù)本身的需求來(lái)看,需要交換幾個(gè)信息:媒體信息,網(wǎng)絡(luò)信息仅偎,具體業(yè)務(wù)跨蟹。

**一、**媒體信息

需要媒體數(shù)據(jù)來(lái)確定呼叫者和被呼叫者共有的編解碼器和媒體類(lèi)型橘沥。如果嘗試啟動(dòng)通信會(huì)話(huà)的端具有不同的分辨率和編解碼器配置窗轩,則會(huì)話(huà)不太可能成功。通過(guò)使用會(huì)話(huà)描述協(xié)議(SDP)格式的提供和應(yīng)答在對(duì)等方之間交換媒體配置信息的信令座咆,這些信息是通過(guò)SDP協(xié)議描述出來(lái)痢艺,通過(guò)信令服務(wù)器中轉(zhuǎn)的。

**二介陶、**網(wǎng)絡(luò)信息

兩個(gè)WebRTC客戶(hù)端如何發(fā)現(xiàn)對(duì)方的堤舒?通過(guò)信令服務(wù)器交互雙方在Internet上的位置(IP地址和端口),以便呼叫者可以找到被呼叫者哺呜。

**三舌缤、**具體業(yè)務(wù)

**會(huì)話(huà)控制信息確定何時(shí)初始化、關(guān)閉和修改通信會(huì)話(huà)某残,比如加入房間国撵,離開(kāi)房間,禁言玻墅,媒體流訂閱發(fā)布等功能介牙,需要信令服務(wù)器來(lái)控制。



**STUN server **

STUN?(Session Traversal Utilities for NAT?澳厢,NAT會(huì)話(huà)穿越應(yīng)用程序)是一種?網(wǎng)絡(luò)協(xié)議环础,它允許位于?NAT**(或多重NAT)后的客戶(hù)端找出自己的公網(wǎng)地址,查出自己位于哪種類(lèi)型的NAT之后以及NAT為某一個(gè)本地端口所綁定的Internet端端口剩拢。這些信息被用來(lái)在兩個(gè)同時(shí)處于NAT路由器之后的主機(jī)之間建立UDP通信线得。該協(xié)議由RFC 5389定義。****STUN 是 C/S 模式的協(xié)議裸扶,可以簡(jiǎn)單理解為:由客戶(hù)端發(fā)送 STUN 請(qǐng)求框都;STUN 服務(wù)響應(yīng),告知由 NAT 分配給主機(jī)的 IP 地址和端口號(hào)呵晨。一旦擁有了ip和端口魏保,點(diǎn)對(duì)點(diǎn)通信的雙方就能直連通信了。(注:以上的響應(yīng)同時(shí)還使得STUN客戶(hù)端能夠確定正在使用的?NAT類(lèi)型——因?yàn)椴煌腘AT類(lèi)型處理傳入的UDP分組的方式是不同的摸屠。四種主要類(lèi)型中有三種是可以使用的:?完全圓錐型NAT?谓罗、?受限圓錐型NAT和?端口受限圓錐型NAT?——但大型公司網(wǎng)絡(luò)中經(jīng)常采用的對(duì)稱(chēng)型NAT(又稱(chēng)為雙向NAT)則不能使用,這時(shí)TURN就要登場(chǎng)了季二,本文暫且不講)


專(zhuān)有名詞介紹

Signaling Server :信令服務(wù)器檩咱,負(fù)責(zé)處理通信雙方的信息交互揭措,包括媒體信息,網(wǎng)絡(luò)信息刻蚯,業(yè)務(wù)信息绊含。

STUN server:STUN的全稱(chēng)是Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs), 即穿越NAT的簡(jiǎn)單UDP傳輸炊汹,是一個(gè)輕量級(jí)的協(xié)議躬充。可以簡(jiǎn)單理解為:由客戶(hù)端發(fā)送 STUN 請(qǐng)求讨便;STUN 服務(wù)響應(yīng)充甚,告知由 NAT 分配給主機(jī)的 IP 地址和端口號(hào)。

SDP:Session Description Protocol 為了連接到對(duì)端用戶(hù)霸褒,我們必須要對(duì)其他用戶(hù)的設(shè)備情況有所了解伴找,比如音頻視頻的編碼解碼器、使用何種編碼格式废菱、使用何種網(wǎng)絡(luò)技矮、設(shè)備的數(shù)據(jù)處理能力,昙啄,而 SDP 為我們提供了這些功能

ICE:Interactive Connectivity Establishment 通信的兩側(cè)可能會(huì)處于不同的網(wǎng)絡(luò)環(huán)境中穆役,有時(shí)會(huì)存在好幾層的訪(fǎng)問(wèn)控制、防火墻梳凛、路由跳轉(zhuǎn),所以我們需要一種方法在復(fù)雜的網(wǎng)絡(luò)環(huán)境中找到對(duì)方梳杏,并且連接到相應(yīng)的目標(biāo)韧拒。WebRTC 使用了集成了 STUN、TURN 的 ICE 來(lái)進(jìn)行雙方的數(shù)據(jù)通信十性。

offer叛溢、answer:一個(gè) SDP 的握手由一個(gè) offer 和一個(gè) answer 組成,一方發(fā)送offer劲适,另一方接收到offer后楷掉,發(fā)送answer。

**WebRTC音視頻通信流程

**

在同一房間的雙方通過(guò)WebRTC建立音視頻通信霞势,主要分為四個(gè)階段:

(一)加入房間烹植、呼叫對(duì)方,對(duì)方應(yīng)答

** **(1)ClientA登錄后連接信令服務(wù)器愕贡,選擇進(jìn)入某個(gè)房間草雕;

** **(1)ClientB登錄后連接信令服務(wù)器,選擇進(jìn)入某個(gè)房間固以;(1)(2)不分先后

** **(3)ClientA 在此房間中看到ClientB在線(xiàn)墩虹,選擇呼叫ClientB嘱巾;

** **(4)ClientB選擇同意接聽(tīng); (3)(4)中的ClientA和ClientB可以互換诫钓;

(二)交換SDP旬昭,發(fā)送/接收offer,發(fā)送/接收answer

** **(1)ClientA 執(zhí)行g(shù)etUserMedia() ->new RTCPeerConnection->Peer.addStream->createOffer

** **(2)ClientB 執(zhí)行g(shù)etUserMedia() ->new RTCPeerConnection->Peer.addStream菌湃;(1)(2)并行執(zhí)行稳懒;

** **(3)ClientA通過(guò)信令服務(wù)器中轉(zhuǎn)offer給ClientB;

** **(4)ClientB收到offer后慢味,setRemoteDescription->createAnswer场梆;并通過(guò)信令服務(wù)器中轉(zhuǎn)answer給ClientA;

** **(5)ClientA收到answer后顶岸,setRemoteDescription;

(三)交換ICE candidate

** ****(1)ClientA 向STUN Server請(qǐng)求ICE(請(qǐng)求可能在之前某個(gè)時(shí)候已經(jīng)發(fā)出)叫编,STUN Server返回ICE candidate **

** ****(2)ClientB 向STUN Server請(qǐng)求ICE(請(qǐng)求可能在之前某個(gè)時(shí)候已經(jīng)發(fā)出)辖佣,STUN Server返回ICE candidate **

** **(3)ClientA通過(guò)信令服務(wù)器中轉(zhuǎn)ICE candidate到達(dá)ClientB;ClientB通過(guò)信令服務(wù)器中轉(zhuǎn)ICE candidate到達(dá)ClientA霞篡;

** **(4)ClientA收到B的ICE canditate世蔗,addIceCandidate

** **(5)ClientB收到A的ICE canditate,addIceCandidate

(四)開(kāi)始音視頻通信

** **(1)ClientA addStream 展示對(duì)方遠(yuǎn)程音視頻流朗兵;

** **(2)ClientA addStream 展示對(duì)方遠(yuǎn)程音視頻流污淋;


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市余掖,隨后出現(xiàn)的幾起案子寸爆,更是在濱河造成了極大的恐慌,老刑警劉巖盐欺,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座泳,死亡現(xiàn)場(chǎng)離奇詭異锁施,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)傀缩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钉寝,“玉大人闸氮,你說(shuō)我怎么就攤上這事〖锥叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵心铃,是天一觀的道長(zhǎng)准谚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)去扣,這世上最難降的妖魔是什么柱衔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮愉棱,結(jié)果婚禮上唆铐,老公的妹妹穿的比我還像新娘。我一直安慰自己奔滑,他們只是感情好艾岂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著朋其,像睡著了一般王浴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梅猿,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天氓辣,我揣著相機(jī)與錄音,去河邊找鬼袱蚓。 笑死钞啸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的癞松。 我是一名探鬼主播爽撒,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼响蓉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哨毁,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枫甲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后扼褪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體想幻,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年话浇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脏毯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡幔崖,死狀恐怖食店,靈堂內(nèi)的尸體忽然破棺而出渣淤,到底是詐尸還是另有隱情,我是刑警寧澤吉嫩,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布价认,位于F島的核電站,受9級(jí)特大地震影響自娩,放射性物質(zhì)發(fā)生泄漏用踩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一忙迁、第九天 我趴在偏房一處隱蔽的房頂上張望脐彩。 院中可真熱鬧,春花似錦姊扔、人聲如沸惠奸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晨川。三九已至,卻和暖如春删豺,著一層夾襖步出監(jiān)牢的瞬間共虑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工呀页, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妈拌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓蓬蝶,卻偏偏與公主長(zhǎng)得像尘分,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丸氛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容