一次调用有两个 PeerConnections 有什么缺点?

what are disadvantages of having two PeerConnections for one call?

我正在考虑将我的应用程序从使用单个 PeerConnection 双向传输媒体更改为一个 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 } 可能适合您。