无法构建“RTCIceCandidate”无法转换为字典

时间:2021-05-25 18:17:07

标签: webrtc

当被叫对等方尝试添加从呼叫对等方收到的 ICECandidate 时,我不断收到此消息。

Failed to construct 'RTCIceCandidate': cannot convert to dictionary

这是我包装 ICECandidate 的自定义事件对象。该事件对象通过信令通道接收。

enter image description here

这是我的代码,尝试将重建的 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 作为用户代理。我为提供对等方打开一个常规窗口,为应答对等方打开另一个隐身窗口。

1 个答案:

答案 0 :(得分:0)

事实证明,this 是我的问题。

引用 SO 答案中的“这个问题几乎完全没有记录......你不能在没有设置远程描述的情况下添加 ICE 候选......”

调用 addIceCandidate() 不应该在调用 setRemoteDescription() 之前发生

我的解决方案是缓存来自对等方的所有传入 ICE 候选对象,并且仅在 RTCPeerConnection.signalingState 变为 have-remote-offer 后添加它们,这应该在设置远程描述后发生。