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