Mediasoup 雜談(待完善)

語言: CN / TW / HK

1. Mediasoup 基本元件框圖

2. Mediasoup 的初始化基本流程

1. 客戶端訪問 http://192.168.2.84:3000/?info=true , 返回初始化頁面 html

2. 這是一個新發起的請求 websocket
wss://192.168.2.84:4443/?roomId=7xexh3xi&peerId=za4svz6e
客戶端一個請求過來,首先根據 url 裡的 roomId 查詢 Room,如果不存在 Room,則輪詢挑選一個 worker ,產生一個協議層面的 Room 以及通過 worker 產生一個 router ,
通過 router 產生一個與底層互動的 DirectTransport ,這個用來 js 與底層 worker 的信令或資料互動,然後建立一個上層的 Room 物件,包含這些新產生的物件

3. 客戶端首先獲取 getRouterRtpCapabilites

4. 客戶端產生一個 createWebRtcTransport 生產者 和一個 createWebRtcTransport 消費者

5. 客戶端然後執行加入 Room 的指令 join

6. 客戶端執行 connectWebRtcTransport 進行 ice 的相關動作,兩次一個生產者一個消費者

7. 客戶端執行產生 produce ,併為 Room 的每個使用者建立相應的 consume ,後續通過 produce 上傳音視訊資料

 

3.  Producer 的簡單說明

每個 producer 分為三個種類 :  all, audio & video ,根據產生 produce 的 json 欄位 kind 指定,
同時也支援三種類型 type 的輸出,分別為 none, simple, simulcast, svc, pipe,根據產生 producer 的 json 欄位 encodings 進行判斷
當 encodings 列表個數為 1 時,判斷 if (encoding.spatialLayers > 1 || encoding.temporalLayers > 1) 則為 SVC,否則就為 SIMPLE, 當
encodings 列表個數大於 1 時, 則 type 為 SIMULCAST,如果 encodings 為 0 時,則為 NONE

4. 資料接收及轉發流程

UdpSocket ---> WebRtcTransport --- 根據 ssrc 獲取 producer ---> Producer ---> WebRtcTransport ---> Router --- 根據 producer 獲取 consumer ---> consumer (抖動緩衝) ---> WebRtcTransport

5. 題外話

新使用者加入到 Room 會為當前 Room 內已經存在的每一個 producer 產生一個 consumer ,consumer 產生成功,把此 consumer 的資訊通過上述通道,傳送指令 newConsumer 到新使用者的客戶端上,這樣就建立了客戶端與伺服器端的 consumer 的通道,而新使用者的每次建立一個 producer 就會為當前 Room 的已經存在的使用者產生一個 consumer ,然後把此資訊傳送到已經存在的使用者客戶端上,這樣就為已經存在的使用者建立 了consumer 的通道。