webrtc - 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];
解决方案
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
}
};
推荐阅读
- android - div中的垂直居中在移动设备和桌面设备上有所不同?
- python - 如何将列表列表转换为相对频率字典?
- python-3.x - 在 Python 3 中连接 for 循环的字符串输出
- java - 如何在使用入站流通道适配器时从 SFTP 中删除文件
- angular - 如何在父 mousemove 事件上防止 Angular 子组件 ngAfterViewChecked?
- r - 从数据帧的子集采样,其中子集以 R 中另一个数据帧的值为条件
- uwp - C++/WinRT:如何获取当前用户的属性
- c - 如何初始化/定义内存区域并让多个 malloc(在 glibc 中)从该区域分配内存?
- mysql - 用于测试 Django 应用程序的 MySQL 用户权限
- javascript - 如果 url 页面有他的类,则添加按钮类活动