在 owt 里面 webrtc-agent 負(fù)責(zé) webrtc 連接的生命周期管理囚企,提供 webrtc 接入服務(wù)骚秦。
webrtc 入會(huì)流程
入會(huì)
MCU混屏
1. 申請(qǐng)入會(huì)
-
【獲取token】
client 通過 management-api rest 接口得到入會(huì) token
-
POST ${host}/v1/rooms/{roomId}/tokens
-
【接入信令服務(wù)】
client 分析 token 得到 portal 的地址(ip和端口)楞陷,通過 socket.io(底層是 websocket) 發(fā)起連接
(refs: https://github.com/open-webrtc-toolkit/owt-client-javascript/blob/0f1099dbfffca40466826ba5af879ac07cea6e16/src/sdk/conference/client.js#L390)
-
-
【發(fā)送 publish 消息】
socket.io 接入后惫确,先發(fā)送 login (附帶token)登錄鸭津,然后通過 socket.io 發(fā)送 publish 消息請(qǐng)求 webrtc 接入
(refs: https://github.com/open-webrtc-toolkit/owt-client-javascript/blob/0f1099dbfffca40466826ba5af879ac07cea6e16/src/sdk/conference/channel.js#L362)
-
2. 建立 webrtc 連接
-
【做一些會(huì)議業(yè)務(wù)邏輯】
portal 轉(zhuǎn)發(fā) publish 消息到 conference-agent套啤,conference-agent 生成一個(gè) streamId宽气,并轉(zhuǎn)發(fā)到對(duì)應(yīng)的 webrtc-agent
client 攜帶 transportId 則使用該 id 對(duì)應(yīng)的 webrtc-agent(例如 publish 之前進(jìn)行 subscribe,則會(huì)有一個(gè) transportId)潜沦,否則使用 streamId 來作為 trasportId 并向 clusterManager 申請(qǐng)一個(gè)可用的 webrtc-agent
(refs: https://github.com/open-webrtc-toolkit/owt-server/blob/5b7dda5c098f7803ab8934ec66a1dd1b48856e9f/source/agent/conference/conference.js#L1113)
-
-
【生成 RTCPeerConnection】
webrtc-agent 的 publish 方法以 streamId 為標(biāo)識(shí)創(chuàng)建一個(gè) erizo::WebRtcConnection(licode 里面對(duì) webrtc 協(xié)議里的 RTCPeerConnection 的近似實(shí)現(xiàn)) 對(duì)象
(refs: https://github.com/open-webrtc-toolkit/owt-server/blob/5b7dda5c098f7803ab8934ec66a1dd1b48856e9f/source/agent/webrtc/index.js#L238)
-
-
【信令交換萄涯,連接建立】
client 通過 socket.io 發(fā)送/接收 soac/progress 事件來交互 sdp 與 candidate,至此 webrtc 數(shù)據(jù)連接已經(jīng)連通
WebRtcConnection 會(huì)使用構(gòu)造函數(shù)里面?zhèn)鱽淼亩丝诜秶鷻z測并生成 candidate唆鸡。
(refs: https://github.com/open-webrtc-toolkit/owt-server/blob/5b7dda5c098f7803ab8934ec66a1dd1b48856e9f/source/agent/webrtc/wrtcConnection.js#L297 - 服務(wù)端發(fā)送信令)
(refs: https://github.com/open-webrtc-toolkit/owt-server/blob/5b7dda5c098f7803ab8934ec66a1dd1b48856e9f/source/agent/webrtc/wrtcConnection.js#L592 - 處理客戶端信令)
-
-
【收發(fā)數(shù)據(jù)】
erizo:WebRtcConnection 會(huì)根據(jù) SDP/candidate 信息創(chuàng)建 erizo::DtlsTransport 收發(fā)數(shù)據(jù)涝影,并通過 erizo::MediaStream - [Video/Audio]FrameConstructor - [Video/Audio]FramePacketizer 來收發(fā)到 OWT 層
erizo:WebRtcConnection 接收數(shù)據(jù)流程
-
3. MCU 混屏
如果開啟了 video-agent 節(jié)點(diǎn),則服務(wù)端具備 MCU 混屏能力
-
【API請(qǐng)求】
client 調(diào)用 management-api rest 發(fā)送混屏請(qǐng)求
-
PATCH ${host}/v1.1/rooms/{roomId}/streams/{streamId}
{
op: "add",
path: "/info/inViews",
value: string(viewLabel)
}
-
-
【轉(zhuǎn)發(fā) RTP數(shù)據(jù)】
management-api 轉(zhuǎn)發(fā)請(qǐng)求到 conference-agent.controlStream争占,稍作整理后告訴 webrtc 轉(zhuǎn)發(fā) streamId 對(duì)應(yīng)的 rtp 數(shù)據(jù)(webrtc 使用 rtp 格式傳輸媒體數(shù)據(jù))到相應(yīng)的 video-agent
具體流程:
- 通知對(duì)應(yīng)的 webrtc-agent 創(chuàng)建一個(gè) InternalOut 對(duì)象(owt 節(jié)點(diǎn)間收發(fā)數(shù)據(jù)的機(jī)制)燃逻,并調(diào)用 webrtc-agent.subscribe 訂閱 streamId 流到 該 InternalOut
- 通知對(duì)應(yīng)的 video-agent 創(chuàng)建一個(gè) InternalIn 對(duì)象序目,并調(diào)用 video-agent.publish 從該 InternalIn 接收數(shù)據(jù)
- 調(diào)用對(duì)應(yīng)的 webrtc-agent.linkup 讓 InternalOut 的數(shù)據(jù)流向 InternalIn
- 至此 webrtc-agent 的 rtp 數(shù)據(jù)將會(huì)轉(zhuǎn)發(fā)到 video-agent
(refs: https://github.com/open-webrtc-toolkit/owt-server/blob/5b7dda5c098f7803ab8934ec66a1dd1b48856e9f/source/agent/conference/roomController.js#L537)
(注:5.x 使用 InternalIO 點(diǎn)對(duì)點(diǎn)方式傳輸 Internal 數(shù)據(jù),之后修改了 InternalIO 的連接流程伯襟,改用 Server-Client 方式)
-
4. 播放
client 可以選擇訂閱服務(wù)端的 RTP 數(shù)據(jù)流(例如猿涨,混屏流和 webrtc publish 上來的流)
-
【發(fā)送 subscribe 消息】
client 通過 socket.io 發(fā)送 subscribe 消息,附帶 streamId 參數(shù)來請(qǐng)求訂閱對(duì)應(yīng)的流姆怪,subscribe 消息會(huì)轉(zhuǎn)發(fā)到 conference-agent
streamId 列表可以通過 management-api rest 接口獲取
-
-
【混屏流轉(zhuǎn)發(fā)到 webrtc-agent】
conference-agent 收到 subscribe 消息后叛赚,如果 streamId 是混屏流,則通知 video-agent 轉(zhuǎn)發(fā) rtp 數(shù)據(jù)到 webrtc-agent
使用 video-agent.generate 生成一個(gè)輸出流稽揭,并使用 InternalIn,InternalOut,linkup的操作轉(zhuǎn)發(fā)數(shù)據(jù)俺附,類似 webrtc-agent 轉(zhuǎn)發(fā)數(shù)據(jù)到 video-agent的流程
-
-
【webrtc 流程】
整個(gè)訂閱流程與 publish 類似,最后 webrtc-agent 會(huì)收到 subscribe 消息并生成 erizo::WebRtcConnection 對(duì)象與客戶端建立連接
-