
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)之一。
webrtc 是視頻會(huì)議的霸主地位。無(wú)論windows,linux,mac,android,Java,kt,flutter,小程序,iOS 只要能調(diào)用c&c++ 就可以使用。本身就是一個(gè)完整的框架和解決方案。
主要解決一個(gè)問(wèn)題,實(shí)時(shí)的音視頻應(yīng)用。點(diǎn)對(duì)點(diǎn)通信
一個(gè)實(shí)時(shí)音視頻應(yīng)用共包括幾個(gè)環(huán)節(jié):采集、編碼、前后處理、傳輸、解碼、緩沖、渲染等很多環(huán)節(jié)。每一個(gè)細(xì)分環(huán)節(jié),還有更細(xì)分的技術(shù)模塊。比如,前后處理環(huán)節(jié)有美顏、濾鏡、回聲消除、噪聲抑制等,采集有麥克風(fēng)陣列等,編解碼有VP8、VP9、H.264、H.265等。
需要的協(xié)議:
http,tcp/ip,udp,websocket,sdp,rtp,srtp,sturn,turn,ice,tls,dtls,sctp......一整套協(xié)議還是超級(jí)多。

webrtc通信整體解決方案
① 信令服務(wù)器
1)為什么需要信令服務(wù)器?
1.在網(wǎng)絡(luò)上找到需要通信的對(duì)方
2.確定通信的方式,或時(shí)序
2)為什么WebRTC不去實(shí)現(xiàn)信令交換?
不同的項(xiàng)目自己用的協(xié)議和業(yè)務(wù)邏輯都是不一樣的
② NAT 穿越(打洞)
網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translation,簡(jiǎn)稱NAT)是一種在IP分組通過(guò)路由器或防火墻時(shí)重寫(xiě)源IP地址或/和目的IP地址的技術(shù)。這種技術(shù)被普遍使用在有多臺(tái)主機(jī)但只通過(guò)一個(gè)公有IP地址訪問(wèn)因特網(wǎng)的私有網(wǎng)絡(luò)中。
NAT穿越是廣泛用于P2P領(lǐng)域的通信方式,在視頻通話過(guò)程中,NAT穿越也在內(nèi)外網(wǎng)消息通信中起到了至關(guān)重要的作用。
ICE,全名叫交互式連接建立(Interactive Connectivity Establishment),一種綜合性的NAT穿越技術(shù),它是一種框架,可以整合各種NAT穿越技術(shù)如STUN、TURN(Traversal Using Relay NAT 中繼NAT實(shí)現(xiàn)的穿透)。ICE會(huì)先使用STUN,嘗試建立一個(gè)基于UDP的連接,如果失敗了,就會(huì)去TCP(先嘗試HTTP,然后嘗試HTTPS),如果依舊失敗ICE就會(huì)使用一個(gè)中繼的TURN服務(wù)器。
理解概念
兩臺(tái)設(shè)備進(jìn)行點(diǎn)對(duì)點(diǎn)的通信,就不會(huì)走中轉(zhuǎn)服務(wù)器,服務(wù)器的負(fù)擔(dān)會(huì)變小。
但是有一個(gè)問(wèn)題?
假設(shè)兩個(gè)手機(jī)都是公司的內(nèi)網(wǎng),想要通信,在內(nèi)網(wǎng)出去的時(shí)候,內(nèi)網(wǎng)很多機(jī)器對(duì)外公用的一個(gè)IP地址,所以要確認(rèn)一個(gè)IP地址。這個(gè)時(shí)候,我們就需要NAT穿越。
假設(shè)NAT(2)和NAT(3),那么IP地址的確定和網(wǎng)絡(luò)線路怎么走,就需要ICE參與進(jìn)來(lái)。

兩臺(tái)手機(jī)簡(jiǎn)歷了通信通道,本來(lái)是可以直接通信的。但是NAT是會(huì)有失敗的可能性的,所以通過(guò)ICE進(jìn)行轉(zhuǎn)發(fā)。ICE 服務(wù)器通過(guò) stun-turn,將三者綁定到一起。如果點(diǎn)對(duì)點(diǎn)通信能連上,就讓兩臺(tái)手機(jī)自己交流。如果連不上,就走ICE的中繼服務(wù)。
利用ICE進(jìn)行測(cè)試,HTTP->HTTPS-> 中繼TURN服務(wù)。
而我們,實(shí)際,只需要知道ICE Server 提供的IP地址,用戶名,密碼,就足夠了。
信令服務(wù)
兩個(gè)手機(jī)在建立鏈接的時(shí)候,不知道和誰(shuí)建立鏈接,就需要綠色線條的信令服務(wù)器參與,在網(wǎng)絡(luò)中找到通信雙方彼此是誰(shuí),然后確定通信的方式。具體的過(guò)程不管。
所以自己可以設(shè)定自己的協(xié)議demo
client: join(加入房間) ,leave(離開(kāi)房間),message發(fā)消息
sever:joined(客戶端加入),leved(客戶端離開(kāi)),otherjoin(其他人加入),bye(有人離開(kāi)了),full(房間滿)

WebRTC通信過(guò)程
媒體協(xié)商

A,視頻
h264,vp8
B, 視頻
h264,h265
在AB進(jìn)行通信,編解碼,通過(guò)協(xié)商過(guò)程,獲取交集h264,這個(gè)過(guò)程就叫做協(xié)商。
這個(gè)過(guò)程用到的會(huì)話描述協(xié)議,SDP。
通過(guò)SDP發(fā)出Offer ,本機(jī)保存一份,發(fā)送給B,B存下來(lái),然后生產(chǎn)出自己的協(xié)商后的相應(yīng)Answer,發(fā)送給A端,這樣A就知道交集是什么。如果交集有多個(gè),可以自己控制,優(yōu)化和默認(rèn)選擇哪一個(gè)。
協(xié)商通過(guò),就會(huì)通過(guò)ice服務(wù)器,確定A和B是走中繼還是點(diǎn)對(duì)點(diǎn)。
信令設(shè)計(jì)
join leave message(offer,answer,candidate)
joined leaved otherjoin bye full
總結(jié)
我們需要了解的基本知識(shí)
- webrtc 整體架構(gòu)與運(yùn)行機(jī)制
- Nodejs服務(wù)器環(huán)境配置
- 房間服務(wù)器配置
- 信令服務(wù)器設(shè)計(jì)方案
- socket.io實(shí)現(xiàn)移動(dòng)端與瀏覽器端相互通信聊天室
下篇文章繼續(xù)。