Files
EchoChat/boke.md
2026-02-27 15:56:51 +08:00

267 lines
6.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

image.png
# 前言
> 计划重新构建一套 `音视频大型会议直播` 系统,底层使用` 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的职责
![职责 是否负责
UI 展示 ✅
摄像头 / 麦克风 ✅
WebRTC 连接 ✅
会议规则 ❌
房间管理 ❌](https://i-blog.csdnimg.cn/direct/022e41e28c9a47c3be74c77aabaed381.png)
#### 📌 mediasoup-client 核心作用一句话
• 把“业务信令”翻译成“浏览器能跑的 WebRTC 行为”
#### 📌 与其他模块的连接
• WebSocket ⇄ Go 信令层
• RTP / DTLS ⇄ mediasoup Worker直连
---
### 2⃣ Go 控制层(系统中枢)
这是整个系统的“大脑”
#### 📌 核心职责
##### ✅ 信令系统
• WebSocket 长连接
• 消息广播
• 状态同步
##### ✅ 会议系统
• 房间创建 / 销毁
• 用户进房 / 退房
• 主持人 / 角色管理
• 发言权限控制
##### ✅ 安全与鉴权
• JWT / Token
• 防止客户端滥用 mediasoup API
##### ✅ 媒体控制编排
• 什么时候创建 Transport
• 什么时候 Produce / Consume
• 什么时候关闭流
#### 📌 不负责的事情(很重要)
• ❌ 不处理 RTP
• ❌ 不参与媒体转发
• ❌ 不做 WebRTC 协议
#### 📌 与其他模块的连接
![对象 方式
客户端 WebSocket
mediasoup Node HTTP / RPC
Redis 状态缓存
PostgreSQL 持久化](https://i-blog.csdnimg.cn/direct/b0b592baa6974635b8af8fbd13053c03.png)
---
### 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
• 飞书会议
在思想上都是一致的
---