音视频通话信令交互逻辑
小于 1 分钟
Andorid 集成文档
音视频通话信令交互逻辑
信令概述
本系统使用即时通讯 IM 消息作为信令载体,通过消息扩展字段(ext)传递通话控制信息。
核心信令
| 信令类型 | Action 标识 | 发送方 | 接收方 | 描述 | 发送信令消息规则 | 
|---|---|---|---|---|---|
| 通话邀请信令 | CALL_INVITE | 主叫 | 被叫 | 发起通话邀请,包含: - callId: 通话唯一标识。 - channelName:声网 RTC 频道名称。 - callType:CallTypeAudio 为音频通话,CallTypeVideo 为视频通话,CallTypeGroup为群组通话。- callerDevId:主叫设备 ID。对于群聊通话,该信令还包含以下参数: - groupId:群组 ID。 - receiverList:接收通话邀请的目标用户。 | 一对一通话:使用普通文本消息,支持离线推送。  群组通话:使用定向文本消息,设置 chatType = .groupChat,receiverList 指定接收者,支持离线推送 | 
| 响应信令 | CALL_ALERT | 被叫 | 主叫 | 通知主叫已收到邀请,包含: - callId:对应的通话 ID。- calleeDevId:被叫设备 ID。 | 使用 CMD 消息,设置 deliverOnlineOnly = true,表示仅在线用户能收到,不存储。 | 
| 确认振铃信令 | CALL_CONFIRM_RING | 主叫 | 被叫 | 确认被叫可以开始振铃,包含呼叫状态 callStatus:- 1 为呼叫有效- 0 为呼叫无效 | 使用 CMD 消息,设置 deliverOnlineOnly = false。 | 
| 应答信令 | CALL_ANSWER | 被叫 | 主叫 | 通知主叫是否接听,包含 callResult 参数: accept:接听refuse 拒绝busy:忙碌 | 使用 CMD 消息,设置 deliverOnlineOnly = true,表示仅在线用户能收到,不存储。 | 
| 确认被叫信令 | CALL_CONFIRM_CALLEE | 主叫 | 被叫 | 确认被叫设备和状态,包含: - calleeDeviceId:被叫设备标识- callResult:通知主叫是否接听,详见应答信令中的描述。 | 使用 CMD 消息,设置 deliverOnlineOnly = false。 | 
| 取消呼叫信令 | CALL_CANCEL | 主叫 | 被叫 | 主叫取消呼叫。 | 使用 CMD 消息,设置 deliverOnlineOnly = false,便于久不上线的用户收到离线消息做判断。 | 
| 退出通话信令 | CALL_END | 任意一方 | 通话双方 | 退出通话。 | 使用 CMD 消息,设置 deliverOnlineOnly = true。 | 
信令特点
| 信令特点 | 描述 | 
|---|---|
| 信令可靠性 | - 关键信令(邀请)使用普通文本消息 - 实时信令使用 CMD 消息,降低延迟。  | 
| 状态机管理 | - 每个信令对应状态转换。 - 非法状态转换直接忽略。  | 
| 超时保护 | - 多级超时机制。 - 超时后自动清理资源。  | 
| 扩展性设计 | - ext 字段支持自定义扩展。- 群组呼叫信令支持动态成员,用户可随时加人或退出通话。  | 
一对一通话信令交互流程
完整通话信令流程

主叫取消流程

被叫忙碌流程

群组通话信令交互流程
群组通话信令特点如下:
- 批量发送: 一条消息发给多个接收方。
 - 独立响应: 每个被叫独立处理和响应。
 - 动态邀请: 支持通话中继续邀请新成员。
 

信令时序控制
| 信令交互 | 预期响应时间 | 超时处理 | 
|---|---|---|
| CALL_INVITE → CALL_ALERT | 30 秒内 | |
| CALL_ALERT → CALL_CONFIRM_RING | 10 秒内 | 主叫快速判断并响应。 | 
| CALL_CONFIRM_RING → CALL_ANSWER | 30 秒内 | 被叫振铃超时,自动结束。 | 
| CALL_ANSWER → CALL_CONFIRM_CALLEE | 10 秒内 | 主叫快速确认被叫设备以及状态。 | 
| 整体呼叫流程 | 30 秒 | 主叫等待超时,自动取消呼叫。被叫超时不接,同样自动取消。 | 
多设备场景
被叫方使用同一账号登录多个设备,信令中通过主叫或被叫的设备 ID(callerDevId 和 calleeDevId)区分,只有指定的设备处理信令,其他设备收到后忽略或显示类似 “已在其他设备处理” 等提示。
// 判断是否本设备
if calleeDevId == currentDeviceId {
    // 本设备处理
    processCall()
} else {
    // 其他设备处理
    showMessage("已在其他设备处理")
    dismissUI()
}
异常处理
信令丢失处理
| 信令丢失场景 | 处理方式 | 
|---|---|
| CALL_ALERT 信令丢失 | 30 秒后主叫端超时,用户可以点击重新发起呼叫。 | 
| CALL_CONFIRM_RING 信令丢失 | 被叫等待 10 秒后结束呼叫流程。 | 
| CALL_ANSWER 信令丢失 | 主叫 30 秒超时,发送取消呼叫信令。 | 
| CALL_CONFIRM_CALLEE 信令丢失 | 被叫 10 秒超时,主动结束通话。 | 
信令冲突处理
| 信令冲突场景 | 处理方式 | 
|---|---|
| 重复邀请 | 检查 callId,相同则忽略。 | 
| 并发呼叫 | 返回忙碌 busy,保持当前通话。 | 
| 呼叫状态不一致 | 以最新信令为准,更新本地呼叫状态:空闲、拨号中、振铃中、应答中。 | 
