应答 SDP 并启动媒体(VideoRoom start)

验证状态:已源码核验、未联调;Web 发送与中心转发已双侧核验;Janus 服务器行为源码不在本工作区。 适用基线:源码归纳 @ 2026-09-14

用途与场景

Web 收到 Janus 的 SDP offer(join 正本)后,生成 answer 并通过 start 请求回传,完成订阅方向媒体协商。公共口径见 会话正本

使用位置

页面/功能 角色或空间分支
SFU 直播组件在 setRemoteDescription/createAnswer 成功后经串行队列发布 start 登录用户;SDP 已到达且 ICE 配置非空

对应 inventory operationId:mqtt-janusmessagestartfn-server-center-server-iot-v1-forward-janus-to-4e8d1f68

端点

MQTT 发布 server/center-server/iot/v1/forward/janus/to(回包按 transaction 首段 reply topic 回流)— start 请求,回传 Web SDP answer 完成订阅方向媒体协商。

通道契约全量事实见 MQTT 主题清单 · 静态 topic动态下行;字段级契约见 yaml 详解 · forward-janus-to;janus 转发链业务语义见设备业务 · mqtt-bridge 设备消息链。请求报文 {janus:"message", body:{request:"start"}, jsep:<answer>, handle_id, transaction, session_id};transaction suffix 复用 message-join(Web 未用独立后缀,识别时两者不可区分)。发送顺序:setRemoteDescription(offer)createAnswer发布 startsetLocalDescription(answer)

动线与完成判据

  • 发布完成 = publishAsync 成功;媒体就绪 = connectionState==="connected"——Web 未注册 start 应答处理,协商成功以连接状态为准。
  • 无请求级超时;setRemoteDescription/createAnswer/setLocalDescription 的异常按阶段记状态文案,整体失败由 15 秒连接状态重试兜底。

错误与边界

  • start 无应答处理:Janus 对 start 的失败形态缺证;若协商失败,页面停留在连接状态文案并依赖 15 秒重试。
  • transaction suffix 复用 message-join:回包若带同 suffix transaction,Web 的 join/start 分支无法区分(当前逻辑无影响——start 无应答消费,但 App 扩展时应注意)。
  • 中心侧转发边界同 会话正本

调用关系与资源清理

  • 时序:join(SDP 到达)→ start → ICE 候选交换(trickle 正本)→ connectedidr
  • 麦克风轨道随 PeerConnection 关闭统一释放。

已知缺口

Janus 对 start 的应答/失败语义、answer 校验行为源码不在本工作区;未联调。