建立 WebRTC 音频(AudioBridge configure + JSEP answer)

验证状态:已源码核验、未联调;适用基线:源码归纳 @ 2026-09-14

用途与场景

在加入房间后,把浏览器麦克风 offer 作为 JSEP 随 configure 请求发送,换取 Janus 的 answer,完成 WebRTC 音频链路协商。本页是 mqtt-janus-audiobridge-configure 的唯一操作正本。这是对讲媒体就绪的最后一步;configure 成功仍不等价于"能听到声音",还需 answer 应用与 ICE 连通完成。

使用位置

页面/功能 角色或空间分支
对讲房间连接状态机在 startWebrtc 内发布 configure(jsep=browserAudioSession.offer 登录用户;已 joined

端点

MQTT 发布 server/center-server/ptt/v1/forward/janus/to(回包按 transaction 首段 reply topic 回流)— 以 JSEP offer 换 answer,完成 WebRTC 音频协商(janus 动词 configure)。

通道契约全量事实(直通白名单、消费方、转发与回包路由)见 MQTT 主题清单 · 静态 topic动态下行(物理桥与 transaction 回包路由);字段级契约见 yaml 详解 · ptt forward-janus-to;janus 转发链的业务语义见设备业务 · mqtt-bridge 设备消息链

请求报文 {janus:"message", session_id, handle_id, body:{request:"configure"}, jsep:{type:"offer", sdp}}——浏览器 offer 以 JSEP 随请求携带。

动线与完成判据

层级 判据
协商成功 configure 收到 event + jsep.answer 并成功 setRemoteDescriptionapplyRemoteAnswer,失败报 Start WebRTC failed
阶段超时 webrtc 阶段 8 秒 deadline(WebRTC setup timed out);joined 与 ICE 回包谁后到谁触发 startWebrtc,均未完成时由该 deadline 兜底
ICE 连通 由 RTCPeerConnection 状态驱动;webrtcConnected 置位后房间 UI 才认为可讲(state.webrtcConnected
断连容忍 WebRTC 断开有 5 秒宽限(WEBRTC_DISCONNECTED_GRACE_MS);稳定连接 30 秒内断开重置恢复预算(STABLE_CONNECTION_RESET_MS

错误与边界

  • SDP 无效/不支持的编解码 → 插件/核心错误(/ 均为不可自动重试)。
  • 应答 eventjsep 非 answer → 不结算,继续等待直至超时。
  • answer 应用失败(本地 setRemoteDescription 异常)→ failConnection("Start WebRTC failed"),走恢复状态机。

调用关系与资源清理

  • 时序:… → joinconfigure → trickle 双向。
  • 浏览器音频会话(getUserMedia、RTCPeerConnection)由 browser-audio-session 管理;连接更替时旧会话经 abort/deferred cleanup 释放。

已知缺口

  1. Janus 侧 SDP/编解码协商行为(pcma 网关、降噪注释见中心建房 request 的现场说明)源码不在本工作区;未联调。
  2. 音频质量、抖动缓冲等媒体面指标完全缺证。