ICE交换后WebRTC连接失败,视频无法显示求助
排查WebRTC连接失败步骤
1. SDP交换完整性与正确性检查
- 确认ROS传输的SDP无截断:检查ROS消息 payload 容量是否足够,避免丢失
a=ice-ufrag、a=ice-pwd等关键字段 - 验证媒体编码匹配:对比两端SDP的
m=video段,确保aiortc服务端生成的编码(如VP8、H.264)被Web客户端支持 - 检查
c=字段:局域网环境下SDP应使用本地IP(如192.168.x.x),而非0.0.0.0或公网IP,保证地址可解析
2. ICE候选处理逻辑验证
- 确认ICE候选收发时机:需在SDP交换完成后实时发送所有本地候选,避免遗漏导致连通失败
- 筛选有效候选:局域网内优先使用host类型候选(本地IP+端口),禁用不必要的STUN/TURN配置
- 验证候选添加逻辑:
- 服务端需确保收到ROS消息后调用
pc.addIceCandidate(candidate) - Web客户端需通过
pc.addIceCandidate(new RTCIceCandidate(candidate))正确添加候选
- 服务端需确保收到ROS消息后调用
3. ROS消息可靠性排查
- 检查消息完整性:在两端添加日志,记录SDP/ICE消息的收发时间与内容哈希,对比是否一致
- 验证序列化格式:SDP以纯字符串传输,ICE候选需用JSON格式,确保两端解析无格式错误(如引号转义、字段大小写不匹配)
- 确认ROS节点状态:用
rosnode list和rostopic echo命令验证话题通信正常,无节点失联
4. 代码关键逻辑审查
服务端(aiortc)常见问题
- 简化PeerConnection配置:局域网无需STUN,直接创建实例
pc = RTCPeerConnection() # 不传入iceServers参数,默认使用本地候选 - 确保视频流添加时机:在创建offer/answer前将视频轨道加入PeerConnection,保证SDP包含媒体流信息
- 监听ICE状态:添加日志跟踪
iceconnectionstatechange事件,确认状态流转(如new→checking→connected)
Web客户端常见问题
- 确认媒体权限:确保
getUserMedia调用成功,已获取摄像头权限并将视频轨道加入PeerConnection - 添加状态监听代码:
pc.oniceconnectionstatechange = () => { console.log('ICE连接状态:', pc.iceConnectionState); }; pc.ontrack = (event) => { console.log('收到视频轨道:', event.track); document.getElementById('video').srcObject = event.streams[0]; };
5. 网络连通性测试
- 直接测试端口连通:用
telnet <对方IP> <端口>或nc -zv <对方IP> <端口>验证ICE候选中的端口可访问 - 确认局域网配置:确保两端在同一子网,无VLAN隔离,能互相ping通
内容的提问来源于stack exchange,提问作者assort
相关产品推荐
相关产品推荐

