WebRTC ICE连接因“Consent to send expired”失败求助
问题诊断与解决方案
核心原因分析
“Consent to send expired”报错源于aiortc默认启用的ICE同意机制(Consent Freshness),该机制要求定期发送STUN绑定请求来维持媒体发送权限。若服务器在超时窗口内未收到客户端的ICE响应,就会触发该错误并断开连接。
具体修复步骤
1. 临时关闭aiortc的ICE同意检查(快速验证)
在服务器端创建RTCPeerConnection时,通过配置禁用同意超时机制,快速确认是否为该机制导致的问题:
from aiortc import RTCPeerConnection, RTCConfiguration pc = RTCPeerConnection( configuration=RTCConfiguration( iceServers=[{'urls': 'stun:stun.l.google.com:19302'}], iceTransportPolicy='all' ), consent_timeout=0 # 禁用同意过期检查 )
注意:此方法仅用于验证,生产环境建议保留机制并修复交互问题。
2. 配置SIPSorcery客户端定期发送ICE心跳
SIPSorcery默认不会主动持续发送ICE绑定请求,需手动添加定时任务维持ICE交互:
using SIPSorcery.Net; using System.Threading.Tasks; // 初始化PeerConnection后 var pc = new RTCPeerConnection(); // 每隔30秒发送一次STUN绑定请求,保持ICE连接活性 _ = Task.Run(async () => { while (pc.IsActive) { await pc.SendSTUNBindingRequest(); await Task.Delay(30000); } });
3. 确保ICE服务器配置一致
- 客户端与服务器必须使用相同的STUN/TURN服务器,例如统一配置
stun:stun.l.google.com:19302 - 内网环境优先依赖主机候选(Host Candidate),避免STUN穿透失败导致的连接断层
- 若使用TURN服务器,需确保两端的用户名、密码配置完全匹配
4. 验证媒体流持续推送逻辑
服务器端合成视频流中断或推送不连续,也可能触发连接异常。需确保视频帧推送逻辑稳定:
async def video_track_task(track): while True: # 生成合成视频帧(示例逻辑,替换为实际帧生成代码) frame = create_synthetic_video_frame() await track.send(frame) await asyncio.sleep(1/30) # 按30fps频率推送
额外排查方向
- 核对两端ICE候选日志,确认是否存在成功配对的候选(如
host或srflx类型) - 检查防火墙/网络策略,确保UDP 3478(STUN端口)及媒体端口段(通常49152-65535)双向通信不受限
- 服务器端开启aiortc详细日志,追踪ICE交互细节:
import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

