我已经设置了一个WebRTC应用程序,其工作方式如下:(从第5步开始,停止使用调用方/ CALLEE,因为调用方或CALLEE都可以启动流)
如果PEERA和PEERB都在使用Chrome:如果PEERA是调用者,那么一切都正常,PEERB成功地接收到了流。如果PEERA是CALLEE,那么PEERB在第8步设置本地描述时就会爆炸。该流由PEERB接收,但仅在发送到<video>
元素时显示为黑匣子。
记录的错误是:
未能设置本地应答sdp:未能按下传输描述:未能为通道设置SSL角色。
当PEERA和PEERB都在使用FireFox时: PEERA可以是调用方,也可以是CALLEE,一切正常,并且PEERB成功地接收了流。
当CALLEE使用Firefox,调用者使用Chrome时: PEERA可以是调用者(Chrome),也可以是CALLEE(Firefox),一切正常,PEERB成功地接收到流。
当CALLEE使用Chrome而调用者使用FireFox时:如果PEERA是调用者(FireFox),那么一切都正常运行,PEERB(Chrome)成功地接收到了流。如果PEERA是CALLEE(Chrome),那么当设置远程描述时,PEERB(FireFox)在第8步就会崩溃。
记录的错误是:
DOMException InvalidSessionDescriptionError:“此时不支持重新启动(新的远程描述更改ice-ufrag或ice-pwd)ice-ufrag (旧):a59T34ixyZjsTuJice-ufrag(新):rsCN1ugVKHJJzmMbicePWD(旧):KqOHtqdzFp6VwG+3 3hxbjcQFcice D(新):uVvowvgsKIwuCq/bDmcGbSPA”代码:0 nsResul0: 0x0
发布于 2015-12-17 15:19:36
Chrome<->铬重新协商
当PEERA是重新协商中的被调用者时,您所得到的错误通常是由于Chrome更改了DTLS角色,但是I am 无法重现您的问题。我相信这个JSFiddle链接说明了您正在描述的场景,并且我能够成功地使用Chrome 47重新协商调用。
如果您仍然可以重现这个问题,请查看在“要约/答案”中生成的SDP的a=setup:
位,并将它们与初始的“报价/答案”进行比较。如果我是对的,您将看到,首先,调用者将在报价中使用a=setup:actpass
,而CALLEE将在回答中使用a=setup:active
。这意味着调用方现在扮演的是“被动”DTLS角色,CALLEE扮演“主动”DTLS角色。
然后,当你开始重新谈判时,PEERA更有可能发送a=setup:actpass
。应该发送a=setup:passive
的PEERB正在发送a=setup:active
,这实际上会导致DTLS角色交换。这个错误是因为Chrome不支持为对等连接更改DTLS角色。
有一个与此相关的在跟踪器上打开票证,在这里,我已经发布了您使用不同场景描述的问题的复制:启动一个视频专用电话,以及重新协商以添加video+audio。
目前我所知道的唯一解决方案是在调用setLocalDescription之前"munge“(修改) SDP,这样它就有了您想要的值。因此,例如,如果您要处理一个答案,并且您知道您是被动 DTLS角色,您可以这样做
answer.sdp = answer.sdp.replace('a=setup:active','a=setup:passive');
pc.setLocalDescription(answer).then(...);
Firefox<->火狐重新协商
是啊,一切都很好!这是因为Firefox在我运行的所有测试中重新协商DTLS角色时“做了正确的事情”。看看这些SDP和Chrome之间的区别。
Firefox<->Chrome重新协商互操作
I am能够重现您描述的问题,InvalidSessionDescriptionError出现在火狐中。我还没有想出一个解决办法,也不知道原因。
我还有很多其他的重新谈判的问题。现在真让人气馁。
如果您了解到更多信息,请回发。当然,在重新谈判的互操作中,仍有很多人在挣扎!
https://stackoverflow.com/questions/34095194
复制