音視頻通話難點:
音視頻編解碼原理
IP4中,設(shè)備在各自的內(nèi)網(wǎng),需要p2p打洞
音頻降噪和回聲消除
信令服務(wù)器:
設(shè)備連接的socket服務(wù)器
傳遞各個設(shè)備之間的信息:傳遞各個節(jié)點的sdp信息,傳遞ice信息
包含業(yè)務(wù)功能:如加入、離開房間等
打洞服務(wù)器:
為什么打洞?
IP4中,設(shè)備在各自的內(nèi)網(wǎng),各自的內(nèi)網(wǎng)不能通信,而想要通信,就需要突破內(nèi)網(wǎng)限制;
如果用服務(wù)器中轉(zhuǎn),則會加大服務(wù)器開銷和增加延時;
若不用中轉(zhuǎn),就需要點對點(p2p)打洞,來實現(xiàn)通信;
NAT
網(wǎng)絡(luò)地址轉(zhuǎn)換
設(shè)備若想鏈接公網(wǎng),需要經(jīng)過路由轉(zhuǎn)換,將私有IP轉(zhuǎn)換為公網(wǎng)IP
在設(shè)備和路由中存在IP端口映射表NAPT
如:
設(shè)備A的某個應(yīng)用私有IP端口為:192.168.1.10:9000;
設(shè)備A連接的路由器L的公網(wǎng)IP為:200.180.190.11;
那么在路由器L中會有一個端口映射設(shè)備A: 200.180.190.11:21111;
200.180.190.11:21111就是設(shè)備A的某個應(yīng)用的公網(wǎng)IP地址和端口的映射;
SDP:
描述了客服端到服務(wù)端通信的各個網(wǎng)絡(luò)地址及端口等信息;
ps:一段文本,就像一個列表,記錄了客戶端到服務(wù)端,中轉(zhuǎn)次數(shù)及各個中轉(zhuǎn)點的路由信息;
兩個設(shè)備實現(xiàn)通信要求:
設(shè)備A、設(shè)備A的路由AL、設(shè)備B、設(shè)備B的路由BL;
設(shè)備A若想給設(shè)備B發(fā)消息,AL需要知道B在BL中的IP和端口映射;
同理,設(shè)備B若想給設(shè)備A發(fā)消息,BL需要知道A在AL中的IP和端口映射;
打洞流程:
角色:信令服務(wù)器、打洞服務(wù)器、設(shè)備A、設(shè)備A的路由AL、設(shè)備B、設(shè)備B的路由BL;
通過信令服務(wù)器(socket服務(wù)器)將設(shè)備A到打洞服務(wù)器的各個sdp發(fā)送給設(shè)備B;
通過信令服務(wù)器(socket服務(wù)器)將設(shè)備B到打洞服務(wù)器的各個sdp發(fā)送給設(shè)備A;
設(shè)備A嘗試發(fā)送一條消息到設(shè)備B,這條消息是發(fā)送不過去的;因為BL里沒有A和AL的映射IP和端口;
但是此時AL會在自己的NAPT表中記錄B和BL的映射IP和端口;
設(shè)備B發(fā)送一條消息給設(shè)備A,這條消息時可以發(fā)送到的。因為AL的NAPT表中有B和BL的映射IP和端口;并且BL會在自己的NAPT表中記錄A和AL的映射IP和端口;
此時A和B就可以直接互相發(fā)送消息了,不再需要服務(wù)器了;
整個過程就是序號1->2->3->4->5->6->7->8>9
過程一:1->2
此過程為用戶B向服務(wù)器請求向用戶A打洞
過程二:3->4
此過程為服務(wù)器相應(yīng)用戶B的打洞請求,告訴用戶A用戶B想與你打洞(數(shù)據(jù)包中包含用戶B的地址信息)。
過程三:5->6
用戶A主動發(fā)一條信息給用戶B,目的是為了使得路由器A中能夠有一條關(guān)于路由B的IP的路由信息(注意不是用戶B,用戶B是私有IP),就如圖所示,這條信息會被丟棄的,因為路由B的路由表中沒有路由A的IP的信息。
過程四:7->8->9
用戶B再發(fā)一條信息給用戶A,因為此時路由A的路由表中有關(guān)于路由B的IP的路由信息,此時路由A就能路由給用戶A了,至此,用戶A就能直接收到用戶B發(fā)的信息了。注意,此時用戶A發(fā)給用戶B不需要打洞,因為路由B中已經(jīng)有關(guān)于路由A的IP的路由信息了。
webrtc業(yè)務(wù)流程:
音視頻一對一通話、多對多會議都是基于房間進行;
角色:信令服務(wù)器S、打洞服務(wù)器T、設(shè)備A(被請求)、設(shè)備A的路由AL、設(shè)備B(主請求)、設(shè)備B的路由BL;
第一種情況
設(shè)備A進入房間時,沒有其他設(shè)備;
設(shè)備A進入房間,信令服務(wù)器S給設(shè)備A返回設(shè)備A的唯一標(biāo)識符socketId;
設(shè)備A開啟本地預(yù)覽:設(shè)置視頻源、音頻源、渲染到surface;
等待獲取其他設(shè)備發(fā)送的請求offer...
準(zhǔn)備sdp交換
設(shè)備A收到信令服務(wù)器S發(fā)送來的設(shè)備B的socketId和sdp;
設(shè)備A請求信令服務(wù)器,信令服務(wù)器返回設(shè)備A到打洞服務(wù)器的網(wǎng)絡(luò)節(jié)點各個sdp
設(shè)備A設(shè)置本地sdp、設(shè)置收到的遠端sdp;
設(shè)備A使用信令服務(wù)器S通過收到的socketId將自己的sdp發(fā)送給其他設(shè)備B;sdp交換完成
開始打洞:ICE交換
設(shè)備A通過異步消息獲得打洞服務(wù)器返回的自己的ICE信息;
設(shè)備A通過信令服務(wù)器S將ICE信息發(fā)送給設(shè)備B;
等待設(shè)備B連接;
ICE交換完成后
獲取遠端設(shè)備B的視頻流、音頻流,進行解碼播放;
第二種情況
設(shè)備B進入房間時,已有其他設(shè)備,如:設(shè)備A...;
此時設(shè)備B需要主動去呼叫設(shè)備A;
設(shè)備B連接信令服務(wù)器S;
設(shè)備B進入房間,信令服務(wù)器S給設(shè)備B返回設(shè)備B的唯一標(biāo)識符socketId,和其他存在的設(shè)備的socketId列表;
設(shè)備B開啟本地預(yù)覽:設(shè)置視頻源、音頻源、渲染到surface;
開始sdp交換
設(shè)備B請求打洞服務(wù)器T,獲取設(shè)備B到打洞服務(wù)器T的網(wǎng)絡(luò)節(jié)點的各個sdp
設(shè)備B設(shè)置自己的sdp;
設(shè)備B使用信令服務(wù)器S通過socketId列表將自己的sdp發(fā)送給其他設(shè)備A;
設(shè)備A收到sdp后,設(shè)備A使用信令服務(wù)器S通過設(shè)備B的socketId,將自己的sdp發(fā)送給其他設(shè)備B;
設(shè)備B設(shè)置收到的遠端sdp(可能有多個);sdp交換完成
開始打洞:ICE交換
設(shè)備A通過異步消息獲得打洞服務(wù)器返回的自己的ICE信息;
設(shè)備A通過信令服務(wù)器S將ICE信息發(fā)送給設(shè)備B;
設(shè)備B根據(jù)收到的ICE信息去發(fā)送一個請求;此時設(shè)備B鏈接的路由器BL里就有了設(shè)備A在路由AL的IP和端口映射信息;ICE交換完成
設(shè)備B鏈接其他設(shè)備的視頻流、音頻流,進行解碼播放;