You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端订阅者挂断通话时ICE连接异常失败问题排查

Android Janus-Gateway WebRTC ICE连接10秒后触发FAILED的问题解决

问题根源

Android和iOS端WebRTC的ICE连接状态处理逻辑存在差异:

  • Android的PeerConnection在ICE进入DISCONNECTED状态后,会默认持续尝试重连约10秒,超时后直接触发FAILED状态;
  • iOS端在收到Janus的leaving或detached事件时,会主动终止ICE重连流程,因此不会走到FAILED状态。
    另外,你的Android代码在收到订阅者离开的事件后,没有及时清理PeerConnection资源,导致连接实例还在后台尝试恢复,最终触发超时失败。

解决步骤

1. 在订阅者离开时立即销毁PeerConnection

当subscriberOnLeaving()回调触发时,马上执行资源清理:

if (peerConnection != null) {
    // 移除本地媒体流
    for (MediaStream stream : peerConnection.getLocalStreams()) {
        peerConnection.removeStream(stream);
    }
    // 关闭并释放PeerConnection
    peerConnection.close();
    peerConnection = null;
}

这样能直接终止PeerConnection的所有连接尝试,不会触发后续的FAILED状态。

2. 对齐iOS端的事件处理时机

检查iOS代码在收到janus: detached事件时的操作,确保Android端在相同节点执行资源释放,比如在收到janus: success和janus: detached后,再次确认PeerConnection已被正确销毁,避免残留实例。

3. 可选:禁用ICE自动重连超时

如果需要保留PeerConnection复用的可能,可以修改ICE服务器配置,禁用超时重连:

PeerConnection.IceServer iceServer = PeerConnection.IceServer.builder("stun:stun.l.google.com:19302")
        .setIceConnectionTimeout(0) // 关闭自动超时重连
        .createIceServer();

但这种方式可能导致连接状态更新不及时,优先推荐第一种方案。

调整后预期日志

修改完成后,对方挂断的日志流程应该不再出现FAILED状态:

janus: event - plugin -> unpublished
IceConnectionState newState is: DISCONNECTED
onIceDisconnected()
janus: hangup
janus: event - plugin -> leaving
subscriberOnLeaving()
// 此处执行PeerConnection.close()
janus: success
janus: detached

内容的提问来源于stack exchange,提问作者Sajid Zeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:22:52