请求形态
我们向你注册的cb_url 发 POST 请求,事件名同时出现在查询参数与请求体里:
data,外层三个字段恒定。time 是事件发生的秒级时间戳。
验签(务必做)
回调请求头带的签名与调用 srvapi 时的签名算法完全一致(见概览), 只是方向相反:这次是我们用你的app_key 签名,你来验。请求头为 app_id / nonce / timestamp / signature。
不验签意味着任何人只要知道你的回调地址就能伪造事件,请不要跳过这一步。
应答要求
- HTTP 状态码必须为
200 - 响应体必须是标准 JSON:
{"code": 0} - 我们的请求超时为 5 秒,你的处理逻辑要在此之内返回(重活请异步化)
只有
agent_join 与 agent_operate 是同步调用,其余都是异步通知。
异步通知事件
channel_open — 频道打开
channel_destroy — 频道销毁
reason:1 主动销毁(调了销毁接口)、2 在线人数为 0 自动销毁。
user_join — 用户进入频道
user_leave — 用户离开频道
reason:1主动离开、2被踢、3被顶号、4心跳超时、5频道销毁、6身份变成观众online是该用户离开后会中的在线人数,0意味着人走空了
im_connect / im_disconnect — IM 设备上线 / 下线
im_disconnect 多一个 reason,取值同 user_leave。
device_type:0 未知、1 Windows、2 Android、3 iOS、4 Linux、5 macOS、6 WebRTC、7 微信小程序。
80 起是服务端代理入会的号段(81 MCU、82 SIP、83 H323、84 GB28181、85 RTSP、86 RTMP、87 文件播放、88 流分发、89 语音转写)。
mcu_task — 录制/合流/直播任务状态变化
task_type按位组合,含义见云录制与直播接入指南task_status:0待开始、1进行中、2待结束、3异常结束、4正常结束err_desc仅在异常结束时有内容
mcu_record — 录像文件已完成
vod_size 单位字节,mcu_dur 单位秒。
mcu_alarm — 录制任务告警
talkrec_task — 语音录制任务状态变化
task_status:0 待开始、1 进行中、3 异常结束、4 正常结束(没有 mcu 的「待结束」态)。
语音录制的启动是异步的——调用接口只表示已受理,录音网关入会成功后才转为进行中,
所以这个事件是判断「录音到底跑起来没有」最可靠的信号。
talkrec_record — 一段录音完成
record_id是取播放地址时用的段 ID,不是task_idduration_ms单位毫秒(段通常只有几秒,秒级精度不够)end_reason闭段原因:0未知、1正常松手、2超时切段、3用户离开、4任务停止、5空闲兜底
end_reason 值得留意:2 说明这段被时长上限截断了(同一次讲话会拆成多段),
5 是服务端兜底闭段,频繁出现意味着静音判定没能正常收尾,值得查一下音频质量。
同步调用事件
这两个事件我们等你的回答再继续,因此你的处理必须快(5 秒超时)。agent_join — 设备请求进入频道
type 是代理类型:1 MCU、2 SIP、3 H323、4 GB28181 监控、5 RTSP 拉流、6 RTMP 拉流、7 文件播放、8 流分发、9 语音转写。
no 是设备要进入的目标房间号(你自己业务的会议号)。
你需要把它换成一个会话:用 no 找到对应频道,调获取加入频道token拿到 sid,然后原样回给我们:
code 非 0 即拒绝该设备入会。若你的用户详情不需要扩展 props,且设备无条件可信,可以不订阅本事件。
agent_operate — 会中设备被操作(开关麦、开关摄像头)
code 非 0 即拒绝这次操作。不订阅本事件时自动同意所有设备的流媒体操作。
幂等与顺序
回调是至少一次投递,不保证顺序也不保证不重复:- 重试会带来重复投递,业务侧要按
channel+uid+time之类的组合做幂等 - 网络与队列会打乱顺序,不要依赖”先收到 join 再收到 leave”来维护状态机;需要权威状态时以查询接口为准