我已经设置了一个WebRTC应用程序,其工作方式如下:(从步骤5开始,我停止使用CALLER / CALLEE,因为CALLER或CALLEE可以启动流)
如果PEERA和PEERB都使用Chrome:
如果PEERA是CALLER,那么一切都正常,并且PEERB成功接收流。
如果PEERA是CALLEE,那么在设置LOCAL描述时,PEERB会在步骤8中爆炸。该流由PEERB接收,但在发送到<video>
元素时仅显示为黑盒子。
记录的错误是:
无法设置本地答案sdp:无法按下传输说明:无法为频道设置SSL角色。
当PEERA和PEERB都在使用FireFox时: PEERA可以是CALLER或CALLEE,一切都正常,PEERB成功接收流。
当CALLEE使用Firefox并且CALLER使用Chrome时: PEERA可以是CALLER(Chrome)或CALLEE(Firefox),一切都正常,PEERB成功接收流。
当CALLEE使用Chrome并且CALLER使用Firefox时: 如果PEERA是CALLER(FireFox),那么一切都正常,并且PEERB(Chrome)成功接收流。 如果PEERA是CALLEE(Chrome),那么在设置REMOTE描述时,PEERB(FireFox)会在步骤8中爆炸。
记录的错误是:
DOMException [InvalidSessionDescriptionError:&#34;此时ICE重启不受支持(新的远程描述更改ice-ufrag或ice-pwd)ice-ufrag(旧):a59T34ixyZjsTUuJice-ufrag(new):rsCN1ugVKHJQzmMbice-pwd (旧):KqOHtqdzFp6VwG + 3hxbjcQFcice-pwd(新):uVvowvgsKIwuCq / bDmcGbSPA&#34;代码:0 nsresult:0x0]
答案 0 :(得分:2)
Chrome&lt; - &gt; Chrome重新谈判
在重新协商时,PEERA是被叫方时遇到的错误通常是由于Chrome更改了DTLS角色,但我不能够重现您的问题。我相信this JSFiddle link说明了您所描述的情景,并且我能够使用Chrome 47成功重新协商通话。
如果仍然可以重现问题,请查看在商品/答案中生成的SDP的a=setup:
位,并将它们与初始商品/答案进行比较。如果我是对的,你会看到,开始时,CALLER会在优惠中有a=setup:actpass
,而CALLEE会在答案中有a=setup:active
。这意味着CALLER现在正在扮演“被动”DTLS角色,而CALLEE正在扮演“主动”DTLS角色。
然后,当您启动重新协商时,PEERA很可能会发送a=setup:actpass
。应该发送a=setup:passive
的PEERB正在发送a=setup:active
,这实际上导致DTLS角色交换。该错误是由于Chrome不支持对等连接的DTLS角色更改这一事实。
有一个open ticket on the google chrome bug tracker与此相关,我已经使用不同的场景发布了您正在描述的问题的复制品:启动仅视频通话和被调用者重新协商以添加视频+音频。< / p>
此时我所知道的唯一解决方案是在调用setLocalDescription之前“munge”(更改)SDP,以便它具有您想要的值。因此,例如,如果您要处理答案并且您知道自己是被动 DTLS角色,则可以这样做
answer.sdp = answer.sdp.replace('a=setup:active','a=setup:passive');
pc.setLocalDescription(answer).then(...);
Firefox&lt; - &gt; Firefox重新协商
是的,一切都很棒!这是因为在我运行的所有测试中重新协商时,Firefox“使用DTLS角色做了正确的事”。看看这些SDP和Chrome SDP之间的区别。
Firefox&lt; - &gt; Chrome重新协商互操作
我我能够使用在Firefox中显示的InvalidSessionDescriptionError重现您所描述的问题。我现在还没有能够提出解决方案,也不知道原因。
我也有无数其他重新谈判互操作问题。目前这令人沮丧。
如果您了解更多信息,请回复。绝对还有很多与重新谈判互操作的斗争!