WebRTC Flutter与Python跨网通话失败排查(仅局域网可用)
以下针对你遇到的Flutter与Python WebRTC仅局域网通、公网不通的问题,结合Flutter端已正常的前提,从Python端常见问题入手排查:
ICE候选收集不完整
确认Python端WebRTC库(如aiortc)是否正确配置STUN服务器,并且完整收集ICE候选。示例配置:from aiortc import RTCPeerConnection pc = RTCPeerConnection({ 'iceServers': [{'urls': 'stun:stun.l.google.com:19302'}] })务必等待ICE收集状态变为
complete后再交换SDP,避免仅发送局域网候选导致公网无法连接。SDP交换遗漏公网候选
检查Python端是否在生成SDP时包含了所有收集到的ICE候选。部分Python库需要手动监听icecandidate事件收集候选,或者在ICE收集完成后再创建offer/answer,否则SDP可能只包含局域网IP,无法实现公网穿透。NAT穿透逻辑兼容性问题
打印Python端收集到的所有ICE候选,确认是否包含公网IP的服务器反射候选。如果只有局域网候选,说明STUN服务器未在Python端生效,可能是库的STUN请求处理逻辑存在缺陷,比如未正确解析STUN响应或绑定失败。Python运行环境的网络限制
排查Python脚本所在设备的防火墙/网络规则,确保UDP端口(通常49152-65535范围)对外开放。若使用TURN服务器,需确认是否正确配置TCP模式(如果UDP被封禁),且Python端支持TURN的TCP传输。SDP媒体属性不兼容
对比Flutter与Python生成的SDP内容,检查媒体编码、ICE属性等是否一致。比如Flutter使用的编码格式Python端未支持,会导致连接协商失败。
内容的提问来源于stack exchange,提问作者Muhammad Azeem

