当被叫对等方尝试添加从呼叫对等方收到的 ICECandidate 时,我不断收到此消息。
Failed to construct 'RTCIceCandidate': cannot convert to dictionary
这是我包装 ICECandidate 的自定义事件对象。该事件对象通过信令通道接收。
这是我的代码,尝试将重建的 ICE Candidate 添加到本地 RTCConnection,这会在其下方引发错误。
async function onIceCandidateFromPeer(e) {
console.log('onIceCandidateFromPeer', e);
try {
let candidate = new RTCIceCandidate(e.iceCandidate);
console.log('Reconstruct ICECandidate from peer sucessful', candidate);
await app.connection.addIceCandidate(candidate);
console.log('Add ICE Candidate successful')
} catch(err) {
console.log('Add ICE Candidate failed', err)
}
}
iceCandidate
对象传递给 RTCIceCandidate 构造函数吗?iceCandidate.candidate
线吗?编辑 28/5/2021
我刚刚意识到此错误仅发生在调用方端(即生成“要约”的一端)。它不会发生在接收端(即生成“答案”的一端)。
两个对等点使用完全相同的处理程序代码!
我使用 Google Chrome 90.x 作为用户代理。我为提供对等方打开一个常规窗口,为应答对等方打开另一个隐身窗口。
答案 0 :(得分:0)
事实证明,this 是我的问题。
引用 SO 答案中的“这个问题几乎完全没有记录......你不能在没有设置远程描述的情况下添加 ICE 候选......”
调用 addIceCandidate()
不应该在调用 setRemoteDescription()
之前发生
我的解决方案是缓存来自对等方的所有传入 ICE 候选对象,并且仅在 RTCPeerConnection.signalingState
变为 have-remote-offer
后添加它们,这应该在设置远程描述后发生。