1. Janus插件交互流程
Janus中所有插件都遵循以下基本數據流程:
- 客戶端發送create創建一個Janus會話;
- Janus回覆success返回Janus會話句柄;
- 客戶端發送attach命令在Janus會話上attach指定插件;
- Janus回覆success返回插件的句柄;
- 客戶端給指定的插件發送message進行信令控制;
- Janus上的插件發送event通知事件給客戶端;
- 客戶端收集candidate並通過trickle消息發送給插件綁定的ICE通道;
- Janus發送webrtcup通知ICE通道建立;
- 客戶端發送媒體數據;
- Janus發送media消息通知媒體數據的第一次到達;
- Janus進行媒體數據轉發。
2. Janus信令交互過程
2.1 客戶端與Janus信令交互
- Janus客戶端->Janus網關: Janus客戶端發送create請求創建會話
{
"janus": "create",
"transaction": "XoldN2OmUa3r
}
- Janus網關–>>Janus客戶端: Janus網關創建會話,並返回會話ID
{
"janus": "success",
"transaction": "XoldN2OmUa3r,
"data": {
"id": 7147844471131709
}
}
- Janus客戶端->Janus網關: Janus客戶端發送attach請求使用插件
{
"janus": "attach",
"plugin": "janus.plugin.videoroom",
"session_id": 7147844471131709,
"transaction": "zZxl_ZT7tFwTU"
}
- Janus網關–>>Janus客戶端: Janus網關查找插件,並返回插件ID
{
"janus": "success",
"session_id": 7147844471131709,
"transaction": "zZxl_ZT7tFwTU",
"data": {
"id": 7668325947218508
}
}
- Janus客戶端->Janus網關: Janus客戶端給指定插件發送message(Join)
{
"janus": "message",
"session_id": 7147844471131709,
"handle_id": 7668325947218508
"transaction": "AblncRsrMM3T",
"body": {
"request": "join",
"room": 1234,
"ptype": "publisher",
"display": "ban"
}
}
- Janus網關–>>Janus客戶端: Janus網關返回ack消息
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "AblncRsrMM3T"
}
- Janus網關–>>Janus客戶端: Janus網關處理message,並將結果通過event事件發送給客戶端
{
"janus": "event",
"session_id": 7147844471131709,
"transaction": "AblncRsrMM3T",
"sender": 7668325947218508,
"plugindata": {
"plugin": "janus.plugin.videoroom",
"data": {
"videoroom": "joined",
"room": 1234,
"description": "Demo Room",
"id": 8177683424697792,
"private_id": 1508384900,
"publishers":[]
}
}
}
- Janus客戶端->Janus網關: Janus客戶端給指定插件發送message(Configure & offer)
{
"janus": "message",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "QvOYptHlhVOl",
"body": {
"request": "configure",
"audio": true,
"video": true
},
"jsep": {
"sdp": "......",
"type": "offer"
}
}
- Janus客戶端->Janus網關: Janus客戶端給指定插件發送trickle(Candidate)
{
"candidate": {
"candidate": "candidate:2202484529 1 udp 2122262783 2409:8805:85e3:2dd9:l:l:al91:925c 55527 typ host generation 0",
"sdpMid": "audio",
"sdpMLinelndex": 0
},
"janus": "trickle",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "A39mtuEYv9cR"
}
{
"candidate": {
"candidate": "candidate:2530088836 1 udp 2122194687 192.168.1.106 33864 typ host generation 0",
"sdpMid": "audio",
"sdpMLinelndex": 0
}
"janus": "trickle",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "qFvztALbkXUG"
}
{
"candidate": {
"candidate": "candidate:2202484529 2 udp 2122262782 2409:8805:85e3:2dd9:l:l:al91:925c 42873 typ host generation 0",
"sdpMid": "audio",
"sdpMLinelndex": 0
},
"janus": "trickle",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "VOzahdOJx6pn"
}
{
"candidate": {
"candidate": "candidate:2530088836 2 udp 2122194686 192.168.1.106 44575 typ host generation 0",
"sdpMid": "audio",
"sdpMLinelndex": 0
},
"janus": "trickle",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "spupMHelabw8"
}
- Janus網關–>>Janus客戶端: Janus網關返回message(Configure & offer)的ack消息
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "QvOYptHlhVOl"
}
- Janus網關–>>Janus客戶端: Janus網關處理message(Configure & offer),並將answer通過event事件發送給客戶端
{
"janus": "event",
"session_id": 7147844471131709,
"transaction": "Qv0YptHlhVOl"
"sender": 7668325947218508,
"plugindata": {
"plugin": "janus.plugin.videoroom",
"data": {
"videoroom": "event",
"room": 1234,
"configured": "ok"
"audio_codec": "opus",
"video_codec": "h264"
}
},
"jsep":{
"type": "answer",
"sdp": "......"
}
}
- Janus網關–>>Janus客戶端: Janus網關返回ack消息
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "A39mtuEYv9cR"
}
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "qFvztALbkXUG"
}
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "VOzahdOJx6pn"
}
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "spupMHelabw8"
}
- Janus客戶端->Janus網關: Janus客戶端給指定插件發送trickle(Candidate Complete)
{
"candidate": {
"completed": true
}
"janus": "trickle",
"session_id": 7147844471131709,
"handle_id": 7668325947218508,
"transaction": "43XefXDPTPMX"
}
- Janus網關–>>Janus客戶端: Janus網關返回trickle(Candidate Complete)的ack消息
{
"janus": "ack",
"session_id": 7147844471131709
"transaction": "43XefXDPTPMX"
}
- Janus網關–>>Janus客戶端: Janus網關返回webrtcup消息
{
"janus": "webrtcup",
"session_id": 7147844471131709,
"sender": 7668325947218508
}
- Janus網關–>>Janus客戶端: Janus網關返回media(video)消息
{
"janus": "media",
"session_id": 7147844471131709,
"sender": 7668325947218508,
"type": "video",
"receiving": true
}
- Janus網關–>>Janus客戶端: Janus網關返回media(audio)消息
{
"janus": "media",
"session_id": 7147844471131709,
"sender": 7668325947218508,
"type": "audio",
"receiving": true
}
2.2 客戶端之間的交互
2.3 客戶端keepalive
- Janus客戶端->Janus網關: Janus客戶端發送keepalive
{
"janus": "keepalive",
"session_id": 7147844471131709,
"transaction": "WZqW7GMauQpS"
}
- Janus網關–>>Janus客戶端: Janus網關返回ack消息
{
"janus": "ack",
"session_id": 7147844471131709,
"transaction": "WZqW7GMauQpS"
}
3. 完整信令交互時序圖
4. 參考資料
基於Webrtc和Janus的多人視頻會議系統開發4 - 改造信令交互系統完成sdp交換過程
https://blog.csdn.net/u011382962/article/details/81708519