我希望逻辑上没有缺陷。
第1步:来电者创建优惠
第2步:调用者设置localDescription
步骤3:调用者将描述发送给被调用者
// —————————————-…
你的代码是正确的。这是一个长期存在的问题 Chrome中的错误 同 negotiationneeded 。
negotiationneeded
我把它装进去了 一个小提琴 (右键单击并在两个相邻的窗口中打开,然后单击一个中的呼叫)。
在Firefox中,它可以工作。提议者协商一次,因为您一次添加两个曲目(视频/音频):
negotiating in stable onmessage answer
并且,在回答者方面,您添加的曲目 'stable' 状态被添加到答案中:
'stable'
onmessage offer adding audio track adding video track
但是在Chrome中,它被打破了 negotiationneeded 两次提供者,每个轨道添加一次:
negotiating in stable negotiating in stable onmessage offer DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer onmessage offer DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer onmessage offer DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer
和解雇 negotiationneeded 在回答者方面两次,甚至没有 'stable' 州:
onmessage offer adding audio track adding video track negotiating in have-remote-offer negotiating in have-remote-offer onmessage offer DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer
这些额外的事件导致这里两端看到的相互状态错误的破坏。
具体来说,Chrome违反了两个部分 规范 这里:
“排队任务” 解雇这个事件。 “在一次性对连接进行多次修改的常见情况下,排队可以防止提前进行协商。”
如果连接的信令状态不是 "stable" ,中止这些步骤[以解雇事件]。
"stable"
到处工作 都 Chrome漏洞需要(使用 async / await 为简洁起见):
async
await
let negotiating = false; pc.onnegotiationneeded = async e => { try { if (negotiating || pc.signalingState != "stable") return; negotiating = true; /* Your async/await-using code goes here */ } finally { negotiating = false; } }