# 门铃千人会议室（研讨会 Webinar）架构

Date: 2026-10-27（Asia/Shanghai）  
代码根：`/home/meeting` · 媒体：自建 SRS 5（**不接腾讯云 / 融云 RTC**）

---

## 1. 产品定稿（已锁定）

> **主讲在讲、大家听就行；看直播一样也可以。**

| 角色 | 上行 | 下行 | 说明 |
|------|------|------|------|
| **主持人 host**（role=0） | WHIP 推个人流 + **节目流 program** | WHEP 拉嘉宾 | 节目流供千人观众看播 |
| **嘉宾 guest**（role=1） | WHIP 推个人流 | WHEP 拉主持/其他嘉宾 | 人数少（默认 ≤16） |
| **联席主持 cohost**（role=3） | 同嘉宾，可审批/静音/踢人 | 同嘉宾 | 由主持人 `setRole` 任命 |
| **观众 audience**（role=2） | **无推流** | **仅 HLS / HTTP-FLV**（同直播看播） | 默认加入角色；可上千人 |

流程：观众 `raiseHand` → 主持/联席 `approveSpeak` → 升为嘉宾后获得 WHIP/WHEP。

创建默认：

```json
{ "mode": "webinar", "audience_mode": "hls_flv", "max_guests": 16 }
```

小房间多人对话仍用 `mode=meeting`（原 mesh，**不破坏**）。

---

## 2. 为何 mesh 撑不住 1000 人

| | 小房间 meeting（mesh） | 千人 webinar |
|--|----------------------|--------------|
| 拓扑 | 每人推一路，每人拉其他人 | 少数嘉宾 WebRTC；观众单路拉流 |
| 连接数 | O(N²) Peer / WHEP | 嘉宾 O(G²)，观众 O(N) 拉同一节目流 |
| 适用 | ≤ ~8–12 人 | 嘉宾 ≤16 + 观众 ~1000 |
| `media_mode` | `SRS_MESH` | `SRS_WEBINAR` |

Mesh 下 20 人每人拉 19 路 ≈ 380 条拉流，终端与边缘都会崩。千人必须把「说话的人」和「听的人」拆开。

---

## 3. 媒体模型（复用直播拉流形态）

与直播一致：

- **推流域**：`https://live.menling.com`（WHIP / RTMP）
- **播流域**：`https://zhibo.menling.com`（WHEP / HTTP-FLV / HLS）
- **app**：`meet`（会议室专用；直播为 live 业务 app，路径形态相同）

### 流名

| 流 | stream | 谁推 | 谁拉 |
|----|--------|------|------|
| 个人流 | `meet_{roomId}_{uid}` | host / guest / cohost | 其他嘉宾 WHEP |
| **节目流 program** | `webinar_{roomId}` | **主持人（主讲）WHIP** | **全体观众 HLS/FLV** |

观众拉流 URL（与直播看播同形态）：

```
https://zhibo.menling.com/meet/webinar_{roomId}.flv
https://zhibo.menling.com/meet/webinar_{roomId}.m3u8
```

主持人推节目流：

```
https://live.menling.com/rtc/v1/whip/?app=meet&stream=webinar_{roomId}
```

> v1：**节目流 = 主讲画面**（主持客户端 WHIP 到 `webinar_*`）。  
> 后续可接 SRS 转码/混流，把多嘉宾合成进同一 `webinar_*`（观众 URL 不变）。

### 带宽粗估

假设节目流约 **1.5 Mbps**（720p 通话级）：

| 观众规模 | 边缘出口合计（量级） |
|----------|----------------------|
| 100 | ~150 Mbps |
| 500 | ~750 Mbps |
| 1000 | ~1.5 Gbps |

嘉宾侧另计：每人上行 ~1.5 Mbps + 拉其他嘉宾。观众**不要**对每人建 WHEP。

多边缘：沿用现网 `live.menling.com` 推 / `zhibo.menling.com` 拉；千人时对 `meet` app 的 HLS/FLV 做 CDN 或多节点回源（与直播扩容同一套路）。

---

## 4. 角色与信令

```
create(mode=webinar)
  └─ host role=0，拿到 publish + publish_program

join（观众默认）
  └─ role=2，publish=null，play = program HLS/FLV

raiseHand
  └─ meeting_users.hand_raise=1

approveSpeak(user_id)
  └─ role=1 guest，返回 publish WHIP + play WHEP

muteAll / setRole / kick …
```

v1 信令仍 **轮询** `userList`（webinar 建议 5s）。`userList` 对观众行不返回每人 play URL，避免千人数爆炸；另返回 `program` + `hand_raises[]`。

---

## 5. create 如何选择 mode

| 入参 | 结果 |
|------|------|
| 缺省 / `mode=meeting` | `SRS_MESH`，人人可推，行为与现网小房间一致 |
| `mode=webinar`（或 seminar / 1k / live） | `SRS_WEBINAR`，`audience_mode` 默认 `hls_flv` |
| `audience_mode` | `hls` / `flv` / `hls_flv`（仅 webinar 有意义） |
| `max_guests` | 默认 16，审批连麦上限 |

兼容：旧客户端不传 `mode` → 仍是 meeting mesh，**零破坏**。

---

## 6. API 增量（开放平台）

Base：

- `https://open.menkou.com/api/meeting/{action}`
- `https://meeting.menling.com/api/meeting/{action}`

| Action | 状态 | 说明 |
|--------|------|------|
| `create` | **已实现** | 接受 `mode` / `audience_mode` / `max_guests` |
| `join` / `info` / `userList` | **已实现** | webinar 返回 `program`、role、can_publish |
| `raiseHand` | **已实现** | 观众举手 / 取消 |
| `approveSpeak` | **已实现** | 升/降嘉宾，返回媒体包 |
| `muteAll` | **已实现** | 房级 `mute_all` + 成员 `muted` |
| `setRole` | **已实现** | host/guest/audience/cohost |
| 混流 / 多边缘调度 | **草案** | 观众 URL 稳定，后台换源 |

角色码：`0 host` · `1 guest` · `2 audience` · `3 cohost`。

---

## 7. 库表变更（2026-10-27）

`meeting` 新增：`mode`, `audience_mode`, `mute_all`, `max_guests`  
`meeting_users` 新增：`hand_raise`, `hand_raise_at`, `muted`  

备份：`/home/backup/cleanup/meeting-webinar-1k-20261027/`

---

## 8. 今日已上线 vs 下一步

**已上线（API + 文档）**

- mode 分流与媒体 URL 生成
- 举手 / 审批连麦 / 全员静音 / 设角色
- 开放文档千人章节

**下一步（未做）**

- 主持端 UI：一键推 `publish_program`；观众端只播 FLV/HLS
- SRS 旁路或混流：多嘉宾合成进 `webinar_*`
- 观众列表分页 / 人数缓存（千人 `userList` 全量会偏重）
- 轻量 WS 替代轮询
- 多边缘/CDN 对 `meet/*.m3u8|flv` 的正式扩容演练

---

## 9. 相关链接

| 项 | URL |
|----|-----|
| 开放文档 | https://open.menkou.com/docs/meeting.html |
| Markdown | https://open.menkou.com/docs/MEETING-API.md |
| 本架构 | `/home/meeting/docs/WEBINAR-1K.md` |
| 健康检查 | https://open.menkou.com/api/meeting/health |
