为什么对方接收不到我的ICE候选?
我在用WebRTC做点对点视频通话,设置了onicecandidate事件,但对方就是收不到我的候选信息,折腾了好久搞不懂哪里错了。
代码是这样的:
pc.onicecandidate = (event) => {
if (event.candidate) {
console.log("发送候选:", event.candidate); // 这里确实有输出
// 通过WebSocket发送给对方
ws.send(JSON.stringify({ type: "candidate", candidate: event.candidate }));
}
};
对方的调试日志显示只收到offer和answer,没有candidate类型的消息。检查过网络没问题,信令通道也没报错,发送日志里的candidate对象结构看起来也正常…
onicegatheringstatechange事件完成。WebRTC 在生成 ICE 候选是异步的,而且会分批发送多个候选。你当前的代码只要一触发
onicecandidate就立刻发送,但此时可能还没收集完所有候选,中间就被关闭或跳过了。你需要加一个判断,等
iceGatheringState变成complete后再发送。或者更稳妥的做法是:监听onicegatheringstatechange,确保 ICE 收集完成后再发送整批候选。一个简单修复方法如下:
另外注意,有些浏览器会连续发多个 null 的 candidate,或者中途暂停再继续收集,所以你接收方也得处理这种情况,不能收到一次 null 就以为万事大吉。
如果你在 WP 里面做 WebRTC,别忘了有些插件可能会注入脚本,干扰 WebSocket 通信。最好先禁用插件,用裸站测试信令流程。