我正在尝试通过考虑以下页面中的示例为我的小型视频会议应用程序实现完美的 WebRTC 协商:
https://blog.mozilla.org/webrtc/perfect-negotiation-in-webrtc/
不幸的是,我没有设法让它完全工作,特别是移动 safari 似乎以自己的方式处理回滚行为,这里是处理回滚行为的代码:
if (description) {
const offerCollision = description.type == 'offer' && (makingOffer || pc.signalingState != 'stable');
this.ignoreOffer = !this.polite && offerCollision;
if (this.ignoreOffer) {
return;
}
if (offerCollision) {
await Promise.all([pc.setRemoteDescription({ type: 'rollback' }), pc.setRemoteDescription(description)]);
因此,当在移动 safariofferCollision === true
上检测到报价冲突 () 并pc.setRemoteDescription({ type: 'rollback' })
在我的代码中实现时调用它,它会引发类型错误InvalidStateError
。仔细查看 MDN 中有关此类错误的文档(https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/setRemoteDescription#Browser_compatibility)显示:
“RTCPeerConnection 已关闭,或者处于与指定描述类型不兼容的状态。例如,如果类型为回滚且信令状态为稳定、具有本地-pranswer 或具有-远程- pranswer,抛出此异常,因为您无法回滚已完全建立或处于连接的最后阶段的连接。”
在回滚之前检查对等连接信号状态表明它处于“have-local-offer”状态,这应该没问题,因为 MDN 说InvalidStateError
在状态稳定的状态下回滚是不可能的(抛出), have-local-pranswer,或有-远程-pranswer。
对于另一种情况,当我的桌面 Chrome 浏览器在报价冲突中运行时,一切都在启动回滚之前以相同的信号状态按预期工作。
这里的人是否知道移动 Safari 可能存在什么问题或需要以不同方式处理。