是否可以将WebRTC SDP报价转换为答案?

时间:2018-12-31 19:47:58

标签: javascript webrtc sdp

我有两个要通过WebRTC相互连接的同级。通常,第一个对等方将创建要​​约,并通过信令渠道/服务器将其发送给第二个,第二个对等方将回答。这种情况下工作正常。

但是,有可能支持这样一种情况,即两个对等点碰巧试图同时彼此连接,并且两者都通过信令服务器同时发送SDP提议。

// Both peers do this simultaneously:
const conn = new RTCPeerConnection(null);
const sdpOffer = await conn.createOffer();
await conn.setLocalDescription(sdpOffer);
signalingService.send(peerId, sdpOffer);

// At some point in the future both peers also receive an SDP offer 
// (rather than answer) from the other peer whom they sent an offer to 
// via the signaling service. If this was an answer we'd call 
// RTCPeerConnection.setRemoteDescription, however this doesn't work for an 
// offer: 

conn.setRemoteDescription(peerSDPOffer); 
// In Chrome results in "DOMException: Failed to execute 'setRemoteDescription' on 'RTCPeerConnection': Failed to set remote offer sdp: Called in wrong state: kHaveLocalOffer"

我什至试图通过将SDP类型从offer重写为answer,将setup:actpass重写为setup:active来“转换”接收的对等方提供的答案,但这并没有似乎有效,相反,我得到了一个新的例外。

问题是,是否以某种方式支持此同时连接/提供用例-还是我这次应该关闭一侧/对等RTCPeerConnection并使用RTCPeerConnection.createAnswer实例化一个新的?

1 个答案:

答案 0 :(得分:3)

这种情况被称为“信号眩光”。 WebRTC API并未真正定义处理方式(除了称为“回滚”的东西,但尚未在任何浏览器中实现,并且到目前为止没有人错过它),因此您必须自己避免这种情况。

仅替换a = setup无效,因为底层的DTLS机制仍然需要客户端和服务器的概念。