首页 > 解决方案 > createOffer 中的 iceRestart 选项

问题描述

在网络重新连接时,我们正在尝试创建一个带有参数的报价:

iceRestart : true

但是,在接收者用户它抛出一个错误:

InvalidStateError:无法设置远程报价 sdp:在错误状态下调用:kHaveLocalOffer。

基本上,它试图创建一个新的报价,而不是重新启动现有的连接。在 createOffer 方法中实现 iceRestart 的正确方法是什么?

self.constraints = [[RTCMediaConstraints alloc] 
initWithMandatoryConstraints:
@[
[[RTCPair alloc] initWithKey:@"OfferToReceiveAudio" 
value:@"true"],
[[RTCPair alloc] initWithKey:@"OfferToReceiveVideo" 
 value:@"true"],
[[RTCPair alloc] initWithKey:@"iceRestart" value:@"true"]
] optionalConstraints:nil];
[_peerConnection createOfferWithDelegate:self 
constraints:self.constraints];

标签: webrtcopenwebrtc

解决方案


InvalidStateError: kHaveLocalOffer例如,当您在设置本地 SDP 报价后设置远程 SDP 报价而不是应答时,可能会发生这种情况RTCPeerConnection

如下图所示,disconnected如果双方的网络状况没有变化,WebRTC 可以自动从状态中恢复。因此,只有在iceConnectionState切换到failed或确定您的设备已切换网络并获得不同的 IP 时,才应执行冰重启。

在此处输入图像描述

实现从状态重新连接的最简单方法failed是定义只有一个对等方将执行 iceRestart 提议,例如,发起连接的那个。

一些javascript伪代码:

this.rtcPeerConnection.oniceconnectionstatechange = () => {
      if (this.rtcPeerConnection.iceConnectionState === 'failed' && this.isConnectionInitializer) {
          // createOffer({iceRestart: true})
          // set offer as local description
          // send offer to peer
      }
};

推荐阅读