WebRTC:同时重新协商问题
WebRTC: simultaneous renegotiation issue
Use Case
: 三人正在与同一房间的另外两人进行视频聊天,服务器发送消息,三人都将模式更改为音频,
目前,只有chrome支持重新协商,所以对于firefox,我只是关闭连接并创建新的对等连接,但在我检查双方都是chrome并更改模式后,
- 如果我一次只改变一个点的模式,它会很顺利。
- 但是当消息来自服务器时,两个对等方尝试同时重新协商但没有成功,我得到了类似错误状态的信息:STATE_SENTINITIATE
- 为了解决这个问题,我做了一个解决方法,每当 peerconnection 必须重新协商时,它会检查它是否是调用者
- 如果是,则继续重新协商。
- 否则(如果是应答者),它将更改提供的流并向呼叫者发出重新协商的信号。
- 上述解决方法适用于少数重新协商,但在某些情况下,它会在回答方设置本地描述时抛出错误,声称错误状态为 STATE_INPROGRESS 或 STATE_SENTACCEPT.
如何解决这个问题?
由于重新协商是 state-machine,因此双方同时启动重新协商可能会发生冲突,最终会出现无效状态错误。这叫眩光.
您的解决方法是处理眩光的一种方法,本质上是使用信号来确保重新协商始终从同一端(通常是报价方)发起。
您说即使使用此变通方法,您仍然偶尔会看到无效状态错误。由于重新协商是对等方之间的往返,因此有 window 的时间,如果您还响应新重新协商的信号请求,我想如果您也尝试再次重新协商,您仍然可能会遇到无效状态错误很快。
您可以随时检查 pc.signalingState
属性以了解您的 peerConnection 处于什么状态。当您收到传入消息时,我会查看它是否是问题所在。如果是,我会推迟重新协商,直到您的连接再次处于 "stable" 状态。您可以使用 pc.onsignalingstatechange
来响应状态变化。
另一种我听说过(但没有尝试过)的解决眩光的方法是让同行独立重新谈判,当他们出现眩光时,让报价者总是赢。例如应答者将取消它在接收传入提议时所做的任何尝试(通过某种方式将自身恢复到之前的稳定状态),而提议者将在其自己的尝试期间忽略任何传入提议。
顺便说一句,Firefox 现在也支持重新协商(38 岁以上),因此您也可以在那里尝试一下,看看是否遇到同样的问题。
Use Case
: 三人正在与同一房间的另外两人进行视频聊天,服务器发送消息,三人都将模式更改为音频,
目前,只有chrome支持重新协商,所以对于firefox,我只是关闭连接并创建新的对等连接,但在我检查双方都是chrome并更改模式后,
- 如果我一次只改变一个点的模式,它会很顺利。
- 但是当消息来自服务器时,两个对等方尝试同时重新协商但没有成功,我得到了类似错误状态的信息:STATE_SENTINITIATE
- 为了解决这个问题,我做了一个解决方法,每当 peerconnection 必须重新协商时,它会检查它是否是调用者
- 如果是,则继续重新协商。
- 否则(如果是应答者),它将更改提供的流并向呼叫者发出重新协商的信号。
- 上述解决方法适用于少数重新协商,但在某些情况下,它会在回答方设置本地描述时抛出错误,声称错误状态为 STATE_INPROGRESS 或 STATE_SENTACCEPT.
如何解决这个问题?
由于重新协商是 state-machine,因此双方同时启动重新协商可能会发生冲突,最终会出现无效状态错误。这叫眩光.
您的解决方法是处理眩光的一种方法,本质上是使用信号来确保重新协商始终从同一端(通常是报价方)发起。
您说即使使用此变通方法,您仍然偶尔会看到无效状态错误。由于重新协商是对等方之间的往返,因此有 window 的时间,如果您还响应新重新协商的信号请求,我想如果您也尝试再次重新协商,您仍然可能会遇到无效状态错误很快。
您可以随时检查 pc.signalingState
属性以了解您的 peerConnection 处于什么状态。当您收到传入消息时,我会查看它是否是问题所在。如果是,我会推迟重新协商,直到您的连接再次处于 "stable" 状态。您可以使用 pc.onsignalingstatechange
来响应状态变化。
另一种我听说过(但没有尝试过)的解决眩光的方法是让同行独立重新谈判,当他们出现眩光时,让报价者总是赢。例如应答者将取消它在接收传入提议时所做的任何尝试(通过某种方式将自身恢复到之前的稳定状态),而提议者将在其自己的尝试期间忽略任何传入提议。
顺便说一句,Firefox 现在也支持重新协商(38 岁以上),因此您也可以在那里尝试一下,看看是否遇到同样的问题。