一次调用有两个 PeerConnections 有什么缺点?
what are disadvantages of having two PeerConnections for one call?
我正在考虑将我的应用程序从使用单个 PeerConnection 双向传输媒体更改为一个 PeerConnection 用于上游,一个用于下游用于两个对等点之间的单个调用。
我预见的优势:
- 将提供媒体从
video+audio
更改为 audio
时,不再担心 PeerConnection 的信号状态,反之亦然
- 将像
kurento
这样的媒体服务器插入应用程序可能更容易(在多用户调用的情况下,用户需要的上传带宽更少)。
- (这个不太清楚)单一职责原则,每个PeerConnection都是单一角色。
我想做这个改变的主要原因是,我注意到如果 peer(peer1) 只提供 audio
但其他 peer(peer2) 回答两个 video+audio
,peer1 只收到由于某种原因音频,但如果 peer1 是应答者,它能够毫无问题地接收两个 MediaTracks。不确定它是否是我的应用程序或浏览器中的错误(在 firefox 和 chrome 中得到相同的结果)。我能够通过维护状态、根据状态和内容更改提供者来解决问题,但是两个对等方(几乎)同时更改状态时遇到问题。认为上面的提议会是更简单的解决方案,我可以摆脱维护状态。
除了更多 ICE 候选请求 (n STUN n TURN) 的额外开销、维护额外的 PeerConnections 的明显缺点外,这种设计还有其他可能的问题吗?
资源问题是您正在使用更多端口,因为连接的双方都必须完成 DTLS 握手(这是对等完成的,而不是通过信令服务器)。
一个设计挑战是保持正交跟踪两个连接。如果状态处理不当(浏览器状态错误等),它可能很复杂,并且更容易在底层 webrtc 实现中显示错误。
没有什么能阻止你这样做,但我怀疑有一个更简单的解决方案可以解决你埋没的问题:
the major reason I want to do this change is, I am noticing that if peer(peer1) offers only audio but other peer(peer2) answers with both video+audio, peer1 recieves only the audio for some reason,
别问我为什么,当 peer1 仅提供音频时,默认规范行为是仅从另一端请求音频。要覆盖此设置并让自己也可以接收视频(如果另一方有),请使用 RTCOfferOptions:
peer1.createOffer({ offerToReceiveVideo: true }).then( ... )
(或者,如果您使用的是遗留的非承诺 API,它是第三个参数。)
这样做的好处是它是基于意图的,所以您不需要跟踪任何状态。例如始终使用 { offerToReceiveVideo: true, offerToReceiveAudio: true }
可能适合您。
我正在考虑将我的应用程序从使用单个 PeerConnection 双向传输媒体更改为一个 PeerConnection 用于上游,一个用于下游用于两个对等点之间的单个调用。
我预见的优势:
- 将提供媒体从
video+audio
更改为audio
时,不再担心 PeerConnection 的信号状态,反之亦然 - 将像
kurento
这样的媒体服务器插入应用程序可能更容易(在多用户调用的情况下,用户需要的上传带宽更少)。 - (这个不太清楚)单一职责原则,每个PeerConnection都是单一角色。
我想做这个改变的主要原因是,我注意到如果 peer(peer1) 只提供 audio
但其他 peer(peer2) 回答两个 video+audio
,peer1 只收到由于某种原因音频,但如果 peer1 是应答者,它能够毫无问题地接收两个 MediaTracks。不确定它是否是我的应用程序或浏览器中的错误(在 firefox 和 chrome 中得到相同的结果)。我能够通过维护状态、根据状态和内容更改提供者来解决问题,但是两个对等方(几乎)同时更改状态时遇到问题。认为上面的提议会是更简单的解决方案,我可以摆脱维护状态。
除了更多 ICE 候选请求 (n STUN n TURN) 的额外开销、维护额外的 PeerConnections 的明显缺点外,这种设计还有其他可能的问题吗?
资源问题是您正在使用更多端口,因为连接的双方都必须完成 DTLS 握手(这是对等完成的,而不是通过信令服务器)。
一个设计挑战是保持正交跟踪两个连接。如果状态处理不当(浏览器状态错误等),它可能很复杂,并且更容易在底层 webrtc 实现中显示错误。
没有什么能阻止你这样做,但我怀疑有一个更简单的解决方案可以解决你埋没的问题:
the major reason I want to do this change is, I am noticing that if peer(peer1) offers only audio but other peer(peer2) answers with both video+audio, peer1 recieves only the audio for some reason,
别问我为什么,当 peer1 仅提供音频时,默认规范行为是仅从另一端请求音频。要覆盖此设置并让自己也可以接收视频(如果另一方有),请使用 RTCOfferOptions:
peer1.createOffer({ offerToReceiveVideo: true }).then( ... )
(或者,如果您使用的是遗留的非承诺 API,它是第三个参数。)
这样做的好处是它是基于意图的,所以您不需要跟踪任何状态。例如始终使用 { offerToReceiveVideo: true, offerToReceiveAudio: true }
可能适合您。