You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pion SFU-WS实现WebRTC多视频会议房间功能?

Pion SFU-WS 多会议房间实现方案

你之前的尝试方向有误,webrtc.NewPeerConnection的配置参数不包含房间绑定相关的逻辑,该方法仅用于创建单个WebRTC点对点连接实例,多房间隔离能力需要在SFU的业务逻辑层实现,具体改造步骤如下:

1. 新增房间管理模块

首先在服务端实现房间管理器,用于存储所有房间信息以及每个房间内的参会者连接数据,参考代码如下:

import "sync"

// Room 单个会议房间结构
type Room struct {
    ID           string
    // 存储当前房间内的参会者,key为用户唯一ID,value存储对应用户的PeerConnection及WS连接
    Participants map[string]*UserConn
    Lock         sync.RWMutex
}

// UserConn 单个参会者的连接信息
type UserConn struct {
    PeerConn *webrtc.PeerConnection
    WSConn   *websocket.Conn
}

// 全局房间管理器
var roomManager = struct {
    Rooms map[string]*Room
    Lock  sync.RWMutex
}{
    Rooms: make(map[string]*Room),
}

2. 解析请求中的房间ID

修改WebSocket连接建立的逻辑,在升级HTTP请求为WebSocket连接前,从URL参数中提取room-id,并获取/创建对应房间:

func wsHandler(w http.ResponseWriter, r *http.Request) {
    // 提取房间ID参数
    roomID := r.URL.Query().Get("room-id")
    if roomID == "" {
        http.Error(w, "缺少room-id参数", http.StatusBadRequest)
        return
    }

    // 生成当前用户的唯一标识,可自行实现生成逻辑
    userID := generateUniqueUserID()

    // 从房间管理器中获取房间,不存在则新建
    roomManager.Lock.Lock()
    targetRoom, ok := roomManager.Rooms[roomID]
    if !ok {
        targetRoom = &Room{
            ID: roomID,
            Participants: make(map[string]*UserConn),
        }
        roomManager.Rooms[roomID] = targetRoom
    }
    roomManager.Lock.Unlock()

    // 后续原有WS升级、PeerConnection创建逻辑不变
    // ...
    // 创建完成后将当前用户加入对应房间
    targetRoom.Lock.Lock()
    targetRoom.Participants[userID] = &UserConn{
        PeerConn: peerConnection,
        WSConn:   wsConn,
    }
    targetRoom.Lock.Unlock()
}

3. 改造信令与媒体流隔离逻辑

原有单房间逻辑是全局广播所有信令,需要修改为仅在用户所属房间内广播:

  • 当收到某个用户的Offer、ICE Candidate、媒体流发布等信令时,仅遍历其所属房间的其他参会者转发信令
  • 媒体流转发也仅在同房间内进行,不会将房间1的流推送给房间2的参会者

4. 新增退出清理逻辑

当用户断开WebSocket连接时,将其从所属房间的参会者列表中移除;如果房间内所有用户都已退出,销毁对应房间实例释放内存。


内容的提问来源于stack exchange,提问作者Odd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:06:04