如何向已有两个对等端的WebRTC会话中新增额外的Peer节点
核心前提
WebRTC本身是纯点对点协议,不存在原生的多端会话能力,你要实现3人通话,本质是要搭建全连接Mesh网络:每个对等端和其他所有对等端都建立独立的RTCPeerConnection连接,所有SDP、ICE交换逻辑都是两两独立的,和其他连接无关。
各方案可行性分析
- 方案1(Peer3主动发offer):可行,不需要提前存储原有对等端的ICE候选。每对连接的ICE交换完全独立,Peer3分别和Peer1、Peer2新建
RTCPeerConnection实例,分别调用createOffer()生成对应SDP,通过信令分别发给Peer1、Peer2,两者收到后分别回传SDP answer,之后两边各自在onicecandidate回调中将自己的ICE候选通过信令发送给对方即可,Peer1和Peer2之前交换的ICE候选和这两个新连接完全无关,不需要复用。 - 方案2(Peer3被动收offer):可行。WebRTC没有强制要求谁必须是offer发起方,只要每对连接里一端发offer、另一端回answer即可。你可以设计信令逻辑:新Peer3加入房间后,信令服务器广播通知已在房间的Peer1、Peer2有新成员加入,Peer1、Peer2各自新建和Peer3对应的
RTCPeerConnection,分别调用createOffer()发给Peer3,Peer3收到两个offer后分别调用createAnswer()回传即可。 - 方案3(仅Peer1和Peer3交换):不可行。这个方案只能实现Peer1和Peer3互通,Peer2和Peer3之间没有独立的
RTCPeerConnection连接,两者无法直接通信,必须补充Peer2和Peer3的SDP、ICE交换流程才能实现三端互通。
核心困惑解答
两种方式都完全符合WebRTC规范,没有对错,完全取决于你的业务信令逻辑设计:
- 如果你的逻辑是新用户主动申请加入会话:就让新端遍历当前房间所有已存在的用户,给每个用户新建独立
RTCPeerConnection,调用createOffer()发起请求,等待对方回传answer即可。 - 如果你的逻辑是房间内原有用户负责接纳新成员:就由信令服务器广播新成员加入通知,原有用户各自给新用户发offer,新用户收到后调用
createAnswer()响应即可。
额外注意事项
- 每个
RTCPeerConnection实例只能对应一个对等端,3端场景下每个用户需要维护2个独立的RTCPeerConnection实例,分别对应另外两个用户。 - 不要尝试复用不同连接之间的SDP、ICE候选,所有连接的媒体协商、网络协商都是完全独立的,跨连接复用会直接导致协商失败。
- 当会话人数超过5人时,Mesh模式会因为每个端要上传N-1路流导致带宽占用过高,此时可以考虑切换为SFU架构实现多人通话。
内容的提问来源于stack exchange,提问作者toni rmc
相关产品推荐
相关产品推荐

