简单一句话版
先给你一个总图:
- MCU 和 网关(gateway / Venus):偏“音视频底座”,负责真正的通话/推流。
- imcp / 管控 / 信令:偏“业务大脑”,负责有哪些会议、谁在开会、列表、录制、权限等。
- SDK(venus / venus-sdk):前端/客户端用来“调用这些能力”的开发库。
下面逐个用你的词解释:
1. Venus / gateway / 网关
- Venus:
- 一个音视频引擎 + 网关方案的名字(你项目里用的 venus-0.7.5.js、venus_manager.js 就是它)。
- 负责 WebRTC、SIP 通话、媒体转发等“底层音视频能力”。
- gateway / 网关地址(例:ws://106.120.208.24:8188/gw):
- 是 Venus 网关服务的访问地址,通常是 WebSocket 或 HTTPS URL。
- 你的浏览器 / APP 通过它和 Venus 网关建立连接,做:
- 注册到网关
- 发起/接听音视频通话
- 进会、退会
- 推/拉流等
- 登录页里的“网关地址”填的就是这个。
可以简单理解:Venus + 网关 = 音视频信令 + 媒体通道的入口。
2. MCU(Multipoint Control Unit)
- 中文一般叫“多点控制单元/会议服务器”,例:10.110.0.21:15060。
- 职责:
- 维护每个 SIP 分机(register_code,比如 1002、12233)
- 音视频混屏、转发、录制
- 对讲、监控通道(mcu_channels)、会议室媒体路由等
- 在你项目中:
- 登录页的 MCU 地址 是 IP:端口(如 10.110.0.21:15060)
- Venus SDK 在底层会向 MCU 做 SIP 注册:
- 使用 authuser(name / exten = 账号或分机号)
- 使用 SIP 密码(secret)
- 没有正确的 MCU 地址、分机号和密码,就会出现:
- sip Service Unavailable (503)
- sip Operation has no matching challenge 之类报错。
可以理解成:MCU = 真正开会、混音混画、录制的会议服务器,网关+客户端都要跟它打交道。
3. SDK / venus-sdk
- 你项目里的 sdk.js + venus-core.js 封装了一层 SDK:
- 向外提供简单方法:sdk.login、sdk.callAudio、sdk.callVideo 等。
- 内部调用 Venus 的 legacy 库(venus_manager.js、venus-0.7.5.js),再通过 Venus 去和 网关 + MCU 打交道。
- 对前端开发者来说:
- 你调用的是 SDK(sdk.login({ account, gateway, mcu, register_code }))
- SDK 替你调用 Venus,再去连网关、连 MCU、做 SIP 注册。
一句话:SDK = 给前端用的“封装好的一套 API”,底层真正干活的是 Venus 和 MCU。
4. imcp / 管控 / 信令 / backend
- imcp:你环境里的 管控信令服务,示例地址:
- ws://106.120.208.24:10020/imcp
- 管控(管理控制):
- 管“业务”:有哪些会议、会议列表分页、谁是主持人、谁静音、录制列表、直播列表等等。
- 对应 HTTP 管控后台:http://106.120.208.24:9000/ 以及 /api/imcp-mcu/... 这些 REST 接口。
- 信令(在这个项目语境下):
- 通过 WebSocket(imcp)传输的 业务消息:
- 例如:type: 'meeting', action: 'list'、action: 'mute_all'、type: 'streaming' 等。
- 我们写的 BackendWS / Signaling / SignalingState 就是对这套 后台信令 的封装。
- 区分一下:
- Venus 网关信令:偏音视频、SIP / WebRTC ,走 ws://.../gw
- imcp 管控信令:偏会议/直播业务状态,走 ws://.../imcp
可以想象:
- imcp 管控 = 大脑:管有哪些会议、什么状态
- Venus 网关 + MCU = 身体:具体打电话、开会、推流
5. “信令”这个词本身
- 广义上:非媒体的数据控制消息,用来:
- 建立 / 修改 / 结束会话(谁呼谁、谁挂断)
- 同步状态(静音、举手、布局、直播开启/停止)
- 在你项目里有两层信令:
- 前端 ↔ 管控(imcp):业务信令(会议列表、mute_all、participants list 等)
- 终端 ↔ 网关/MCU(Venus/SIP/WebRTC):媒体信令(SIP REGISTER、INVITE、ICE、SDP)。
总结一张对照表
- Venus / 网关 / gateway:
- 音视频网关 + WebRTC/SIP 信令入口,地址如 ws://106.120.208.24:8188/gw
- 登录页的“网关地址”,call 页通话时使用。
- MCU:
- 会议服务器,多点控制单元,地址如 10.110.0.21:15060
- 存 SIP 分机、混屏、录制,对讲/监控都依赖它。
- SDK(sdk.js + venus-core):
- 给前端用的一层封装:你调 sdk.login/call,内部帮你去连 Venus 网关 + MCU。
- imcp / 管控 WebSocket:
- ws://106.120.208.24:10020/imcp,负责会议/直播等业务信令
- 对应 BackendWS / Signaling / SignalingState。
- 管控后台(HTTP):
- 人用的管理界面 + REST API,会议列表、录制列表等。
- 信令:
- 所有“控制类”的消息统称;
- 既包括 imcp 的会议业务信令,也包括 SIP / WebRTC 层的通话信令。
如果你愿意,我可以画一个简单流程图,把“登录 → 取 register_code/gateway/mcu → SDK → Venus → MCU/imcp”整个链条串起来,便于你和后端、运维对齐。
总体架构流程图(文字版)
先给你一张整体“数据流”图,方便脑子里有全局:
flowchart LR
subgraph Browser[浏览器 / 小京 Web 前端]
Login[登录页 login.html
输入账号/网关/MCU/分机号]
Meetings[会议管理页 meetings.html]
Call[通话页 call.html]
SDK[sdk.js / venus-core.js]
end
subgraph Backend[后台 / 管控]
IMCP_WS[管控信令 WebSocket<br/>ws://106.120.208.24:10020/imcp]
IMCP_HTTP[管控 REST 接口<br/>http://106.120.208.24:9000/api/...]
end
subgraph Media[音视频侧]
VenusGW[Venus 网关<br/>ws://106.120.208.24:8188/gw]
MCU[MCU 会议服务器<br/>10.110.0.21:15060]
end
Login -->|保存 account/gateway/mcu/register_code| Call
Meetings -->|BackendWS / Signaling<br/>会议/直播列表、状态| IMCP_WS
Call -->|调用 sdk.login / callAudio / callVideo| SDK
SDK -->|WebRTC/SIP 信令| VenusGW
SDK -->|SIP 注册: authuser=register_code 或 account<br/>proxy=sip:10.110.0.21:15060| MCU
Meetings -->|HTTP: 会议分页、录制列表等| IMCP_HTTP
登录 → 通话 → MCU / 网关 流程
再用步骤把上图拆开说一遍:
- 登录页 login.html
- 你在页面上填:
- 账号:account
- 密码:password
- 网关地址:gateway_url(如 ws://106.120.208.24:8188/gw)
- MCU 地址:mcu_ip:mcu_port(如 10.110.0.21:15060)
- 分机号(可选):register_code(如 1002、12233)
- 页面把这些值写到 sessionStorage 里,供后面的通话页使用。
- 通话页 call.html 自动登录
- 打开 call 页时,会从 sessionStorage 取:
- account、password
- gateway、mcu
- register_code(如果有)
- 然后调用:
sdk.login({
account,
password,
gateway, // 网关地址
mcu, // MCU IP:port
register_code // 分机号(可选)
})
- SDK / Venus-core 封装参数
// venus-core.js 里
const sipIdentity = register_code || account;
data = {
name: sipIdentity, // SIP name
exten: sipIdentity, // SIP exten
gateway: gateway, // ws://.../gw
server: mcu, // 10.110.0.21:15060
password: password
}
然后调用 legacy:
venus_manager.initAndLogin(data, ...)
- Venus / SIP 注册到 MCU
在 venus_manager.js 里会构造真正的 SIP 注册报文:
register = {
username: 'sip:' + name + '@' + server, // name = 分机号或账号
authuser: name,
secret: password, // 密码
proxy: 'sip:' + server + ":" + port // sip:10.110.0.21:15060
}
- 如果 MCU 上有这个分机号 + 密码 → 注册成功,后面就能呼叫。
- 不匹配就会出现:
- sip Service Unavailable (503):地址不对 / 服务不可用。
- sip Operation has no matching challenge:用户名或密码对不上。
- 发起通话
- 页面输入被叫号码(如 1001),点击拨号:
- sdk.callAudio('sip:1001@ip') 或 sdk.callVideo(...)
- SDK 通过 Venus 网关和 MCU 建立会话,完成媒体通道建立。
管控(IMCP)侧:会议/直播列表和状态
这条链路和上面的“打电话”是并行、互补的:
- 这条线主要负责 业务界面:
- 会议列表 / 历史会议
- 直播列表、录制列表
- 参会人、静音、布局、直播开关等
- 它和 Venus 网关 / MCU 分工不同:
- imcp:业务大脑
- Venus + MCU:音视频通道 如果你愿意,我可以再给一版「最简 2×2 象限图」,帮你快速判断“这个问题该去看哪一块(网关/MCU 还是管控/imcp)”。
2×2 象限图:问题归属快速判断
用两个维度来划分:
- 横轴:媒体相关 ←→ 业务相关
- 纵轴:客户端侧 ←→ 后端侧
四个象限分别是谁?
- A 象限(客户端 & 媒体/业务混合)
- login.html / call.html / meetings.html
- sdk.js、venus-core.js、signaling.js
- 这里的问题通常是:参数没传好、UI 逻辑错误、状态没更新等。
- B 象限(后端 & 业务)
- 管控 WebSocket:ws://106.120.208.24:10020/imcp
- 管控 REST:http://106.120.208.24:9000/api/imcp-mcu/...
- 这里的问题通常是:会议列表不对、状态不更新、权限/接口错。
- C 象限(后端 & 媒体)
- Venus 网关:ws://106.120.208.24:8188/gw
- MCU 媒体通道:10.110.0.21:15060(SIP / RTP 等)
- 这里的问题通常是:SIP 注册错误、Service Unavailable、音视频连不通、ICE 失败。
- D 象限(后端 & 媒体 + 业务控制交界)
- MCU 上的会议控制:布局、混屏策略、录制开关等
- 比如:某些会场看不到画面、录制策略不符合预期,多半在这块配置。
你可以这么用这张图:
- 看到 sip ... 报错、SDP/ICE 日志 → 先看 C 象限(网关 / MCU)和 A 象限 SDK 参数。
- 会议列表、直播列表、参会人错了 → 看 B 象限(imcp / REST)。
- UI 不刷、按钮没反应 → 多半在 A 象限。