音视频通话
这篇解决什么
通话房间落哪张表、媒体和信令各走谁。读完能对上 im_rtc_call + LiveKit,以及后端只签 Token、不转发音视频。
默认端口 48080。先完成 IM 功能设计。信令推送见 IM WebSocket。
示意图:业务状态在库表。媒体进 LiveKit。来电 / 接通 / 结束走 IM 长连接。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 通话 | @RequestMapping("/im/rtc") | ruoyi-office/yudao-module-im/.../rtc/ImRtcCallController.java |
| Webhook | POST /im/livekit/webhook | ImRtcLiveKitController |
| 运营 | /im/manager/rtc | ImRtcCallManagerController |
| 配置 | yudao.im.rtc | ImProperties.Rtc |
| 客户端 | LiveKit SDK 封装 | LiveKitClient |
| 用户页 | 通话容器 | ruoyi-office-vben/.../im/home/components/rtc/ |
接口:/create、/invite(仅群)、/join、/accept、/reject、/cancel、/leave 等。room 是业务 UUID,同时当 LiveKit 房间名。
ImRtcCallStatusEnum:10 创建,20 进行中,30 已结束。第一位非发起人接通后进入 20。主表一行通话,明细在 im_rtc_participant。
yudao.im.rtc.enabled 默认 true。关掉后接口抛未启用。默认 livekit-url 为 ws://127.0.0.1:7880;livekit-api-url 空则把 ws 换成 http 调删房。群通话默认最多 16 人。Token 默认 6 小时。
Webhook:@PermitAll + @TenantIgnore,靠 JWT + body sha256 验签。处理成员离开 / 房间结束做兜底。信令类型 1601–1603 不入库;1610 / 1611 通话开始结束会写入私聊或群消息表。
字段
| 名称 | 说明 | 仓库路径 |
|---|---|---|
room | 业务通话编号 | ImRtcCallDO |
conversationType / mediaType | 私聊或群、音或视 | 同上 |
inviterUserId / groupId | 发起人;私聊群号为空 | 同上 |
status / endReason | 状态机、结束原因 | 同上 |
livekitUrl / apiKey / apiSecret | 媒体服务 | ImProperties.Rtc |
生产必须改 apiSecret
配置类要求 Secret 长度 ≥ 32。默认值只够本机联调。Webhook 伪造请求验签失败会直接丢掉。
演示站客户端走公网 wss 时
删房应配内网 livekit-api-url,避免业务机绕公网 hairpin。ImProperties 注释就是这么写的。
按本仓库 DO 生成的 ER。
配置与操作
YAML 改 yudao.im.rtc:enabled 默认 true(关掉后接口抛未启用);livekit-url 默认 ws://127.0.0.1:7880;livekit-api-url 空则把 ws 换成 http 调删房;apiKey / apiSecret(Secret 长度 ≥ 32);群通话最多 group-max-participants(默认 16);Token 默认 6 小时。
保存后用户在 /im/home 调 POST /im/rtc/create。接口还有 /invite(仅群)、/join、/accept、/reject、/cancel、/leave。room 同时是业务 UUID 和 LiveKit 房间名。后端只签 Token,不转发音视频。来电信令 1601–1603 不入库;1610 / 1611 会写入私聊或群消息。Webhook POST /im/livekit/webhook(@PermitAll + @TenantIgnore)靠 JWT + body sha256 验签。台账在 通话记录(7585,/im/rtc),查询权限 im:manager:rtc:query。媒体连 7880,业务通知走 /infra/ws,两条不要混。开启见 IM 功能设计。

本系统截图:IM 即时通讯 → 通话记录。一行 im_rtc_call,状态 10 创建 / 20 进行中 / 30 已结束。

本系统截图:通话记录点「详情」。参与人在 im_rtc_participant。
