EchoChat搭建自己的音视频会议系统01-准备工作

前言

计划重新构建一套 音视频大型会议直播 系统,底层使用 mediasoup ,信令业务层使用 Golang ,前端使用 uniapp + mediasoup-client ,然后就是数据库服务postgresql+redis等等,一步一步,逐步来

太好了,这一步你已经从"技术选型"迈进到系统工程设计了。我会把这份项目计划写成一份可直接作为你后续详细设计蓝本的总纲,而不是泛泛而谈的 PPT 文案。

下面内容分 7 个部分,你可以把它当成「音视频会议系统 0→1 架构说明书」。

一、项目整体目标与定位

🎯 项目目标

构建一套 跨端可用、可扩展、可演进 的实时音视频系统,支持:

• 多人音视频会议

• 互动直播室

• 后期可扩展:录制、转推、跨服务器、超大房间

🎯 技术核心思想

控制面与媒体面彻底分离

业务系统与实时系统解耦

这是你选用 Go + mediasoup 的最大价值所在。

二、整体技术架构(总览)

技术栈总览

cpp 复制代码
┌────────────────────────────┐
│        Client 层           │
│  uniapp + mediasoup-client │
└───────────▲────────────────┘
            │ WebSocket / HTTPS
┌───────────┴────────────────┐
│        Go 控制层            │
│  (信令 / 会议 / 鉴权)      │
└───────────▲────────────────┘
            │ RPC / HTTP
┌───────────┴────────────────┐
│     mediasoup Node 层       │
│   (媒体控制 API)            │
└───────────▲────────────────┘
            │ IPC
┌───────────┴────────────────┐
│     mediasoup Worker        │
│       (C++ SFU)             │
└────────────────────────────┘

三、各组成部分详细说明(这是核心)

1️⃣ 客户端层(uniapp + mediasoup-client)

📌 构成

• uniapp

• UI、页面、交互

• 多端统一(H5 / App / 小程序)

• mediasoup-client

• WebRTC 协商

• 音视频采集 / 编码 / 发送 / 接收

📌 uniapp职责

📌 mediasoup-client 核心作用一句话

把"业务信令"翻译成"浏览器能跑的 WebRTC 行为"

📌 与其他模块的连接

• WebSocket ⇄ Go 信令层

• RTP / DTLS ⇄ mediasoup Worker(直连)

2️⃣ Go 控制层(系统中枢)

这是整个系统的"大脑"

📌 核心职责

✅ 信令系统

• WebSocket 长连接

• 消息广播

• 状态同步

✅ 会议系统

• 房间创建 / 销毁

• 用户进房 / 退房

• 主持人 / 角色管理

• 发言权限控制

✅ 安全与鉴权

• JWT / Token

• 防止客户端滥用 mediasoup API

✅ 媒体控制编排

• 什么时候创建 Transport

• 什么时候 Produce / Consume

• 什么时候关闭流

📌 不负责的事情(很重要)

• ❌ 不处理 RTP

• ❌ 不参与媒体转发

• ❌ 不做 WebRTC 协议

📌 与其他模块的连接

3️⃣ mediasoup Node 层(媒体控制适配层)

📌 本质定位

C++ SFU 的"遥控器"

📌 职责

• 管理 Worker

• 创建 Router

• 创建 WebRtcTransport

• 管理 Producer / Consumer

📌 特点

• 不懂业务

• 不懂用户

• 只懂"媒体对象"

📌 为什么单独拆出来?

• C++ Worker 高性能

• Node 层方便控制与扩展

• 解耦 Go 与 C++

4️⃣ mediasoup Worker(真正的 SFU)

📌 这是"发动机"

负责:

• RTP 转发

• 拥塞控制

• 带宽自适应

• 多人流转发

📌 特点

• 极高性能

• 完全不关心业务

• 媒体一旦开始,不再经过 Go

5️⃣ PostgreSQL(强一致数据)

📌 存什么?

• 用户

• 房间元信息

• 会议记录

• 权限配置

📌 特点

• 强一致

• 可审计

• 不放"实时状态"

6️⃣ Redis(实时状态 & 协调)

📌 存什么?

• 房间在线用户

• Transport / Producer 映射

• 用户状态(mute / speaking)

• 跨 Go 实例共享状态

📌 特点

• 高速

• 非持久

• 非常适合会议系统

7️⃣ 消息中间件(可选但推荐)

📌 什么时候需要?

• 多 Go 实例

• 跨服务器会议

• 录制 / 转码 / AI 分析

📌 用途

• 会议事件分发

• 异步处理

• 解耦系统模块

四、系统运行时的完整流程(简化版)

cpp 复制代码
1. 用户打开客户端
2. WebSocket 连接 Go
3. Go 校验并允许进房
4. Go 调用 mediasoup 创建资源
5. 前端 mediasoup-client 建立 WebRTC
6. 媒体流直达 mediasoup Worker
7. Go 只负责控制和状态

五、这样设计的好处(非常关键)

✅ 高性能

• 媒体流不经过 Go

• SFU 专注转发

✅ 高可扩展

• Go 可横向扩展

• Worker 可多进程 / 多机

✅ 易演进

• 后期加录制、转推、AI

• 不影响现有会议

✅ 技术边界清晰

• Go 写业务

• JS 写 WebRTC

• C++ 跑媒体

六、这个方案非常"工程化"的原因

这个方案已经是"公司级音视频系统"的标准形态

这套架构:

• 腾讯会议

• Zoom

• 飞书会议

在思想上都是一致的

相关推荐
Vect__32 分钟前
基于线程池从零实现TCP计算器网络服务
c++·网络协议·tcp/ip
naruto_lnq6 小时前
分布式系统安全通信
开发语言·c++·算法
CSDN_RTKLIB8 小时前
【四个场景测试】源文件编码UTF-8 BOM
c++
拾荒的小海螺8 小时前
开源项目:LTX2 高效可控的开源视频生成模型
开源·音视频
肉包_5119 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
Trouvaille ~10 小时前
【Linux】UDP Socket编程实战(一):Echo Server从零到一
linux·运维·服务器·网络·c++·websocket·udp
HellowAmy10 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范
czy878747510 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
十五年专注C++开发10 小时前
MinHook:Windows 平台下轻量级、高性能的钩子库
c++·windows·钩子技术·minhook
一只小小的芙厨11 小时前
寒假集训笔记·树上背包
c++·笔记·算法·动态规划