Web RTC重新协商错误

时间:2015-12-04 18:35:43

标签: google-chrome firefox webrtc

我已经设置了一个WebRTC应用程序,其工作方式如下:(从步骤5开始,我停止使用CALLER / CALLEE,因为CALLER或CALLEE可以启动流)

  1. CALLER仅与数据通道创建对等连接,创建商品,设置本地描述,并向CALLEE发送商品。
  2. CALLEE设置远程描述,创建答案,设置本地描述,并将答案发送给CALLER。
  3. CALLER设置远程说明。
  4. CALLER和CALLEE可以通过数据通道成功通信。
  5. PEERA将音频和/或视频流添加到对等连接。
  6. PEERA' onnegotiationneeded event fires。
  7. PEERA创建报价,设置本地描述,并向PEERB发送报价。
  8. PEERB接收优惠,设置远程描述,创建答案,设置本地描述,并向PEERA发送答案。
  9. 如果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]

1 个答案:

答案 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重现您所描述的问题。我现在还没有能够提出解决方案,也不知道原因。

我也有无数其他重新谈判互操作问题。目前这令人沮丧。

如果您了解更多信息,请回复。绝对还有很多与重新谈判互操作的斗争!