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
相关产品推荐
相关产品推荐

