跳到主要内容

实战项目

7 级递进的项目阶梯。每个项目都给出可复制的目录骨架、关键代码、验收标准和踩坑清单,目标是真的能跑起来,不是只读的伪代码

1. 项目阶梯

级别项目学到什么技术栈状态
L0同页面 Echo Demo三大 API、SDP、ICE 候选纯浏览器✅ 可运行
L11v1 视频通话信令、Perfect Negotiation、TURN 部署Node + ws + coturn📝 详设计
L2多人会议(4~16 人)SFU、Simulcast、订阅模型mediasoup / LiveKit📝 详设计
L3屏幕共享 + 远程协助getDisplayMedia、低延迟控制通道+ Electron 可选📝 详设计
L4WHIP/WHEP 低延迟直播标准化推/拉流、CDN 边缘Pion / LiveKit Ingress📝 详设计
L5AI 增强会议Insertable Streams、降噪、字幕onnxruntime-web / MediaPipe📝 详设计
L6跨端连麦 SDKWeb + RN + 小程序统一接口层uni-app + TRTC 适配📝 详设计

状态说明:✅ 可运行 = 含完整代码;📝 详设计 = 含目录骨架、关键代码片段、验收清单。L1~L6 都给出了能直接对照实现的工程化方案,逐步会补完整可运行版本。

2. 通用交付标准

每个项目都按工程项目验收,至少包含:

维度要求
目录结构client / server / infra 三段式,README 标注
启动文档一条命令能起来,环境变量列表清晰
信令协议消息类型、字段、状态机文档化
错误处理断线重连、超时、ICE Restart 都覆盖
监控埋点getStats 上报关键指标
弱网测试用 Chrome 网络限速或 Linux tc 跑过
安全TURN 短期凭据、房间鉴权

3. 推荐统一技术骨架

webrtc-app/
├── client/
│ ├── index.html
│ ├── src/
│ │ ├── signaling/ # 信令客户端
│ │ ├── rtc/ # PeerConnection 封装
│ │ ├── ui/ # 视图层
│ │ └── stats/ # 上报与可视化
│ └── package.json
├── server/
│ ├── signaling/ # 信令服务(ws / socket.io)
│ ├── sfu/ # SFU 接入(mediasoup/livekit)
│ ├── auth/ # 房间鉴权 / TURN 凭据签发
│ └── package.json
├── infra/
│ ├── coturn/ # coturn 配置
│ ├── docker-compose.yml
│ └── nginx/ # TLS 终结
└── docs/
├── architecture.md # Mermaid 架构图
├── signaling-protocol.md
└── load-test.md

4. 选型推荐

阶段推荐理由
1v1 / 教学原生 API + Node ws不引入 SDK,看清楚每一层
多人会议(4~50)LiveKit工程化最完整、文档好、有云服务可对照
多人会议(精细控制)mediasoup灵活度高、Node + C++、社区强
Go 后端栈Pion + LiveKit Server同 Go 生态
直播推流Pion WHIP / LiveKit Ingress标准化、CDN 友好
全托管腾讯 TRTC / 声网 / 即构国内合规、跨小程序方便

5. 弱网测试方法

5.1 Chrome 自带

DevTools → Network → Throttling,但只影响 fetch/XHR,不影响 WebRTC

5.2 Linux tc(推荐)

# 注入 200ms 延迟 + 1% 丢包
tc qdisc add dev eth0 root netem delay 200ms loss 1%

# 限带宽到 1 Mbps
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

# 清理
tc qdisc del dev eth0 root

5.3 toxiproxy / clumsy

适合在开发机上模拟,对 Windows 用 clumsy

6. 验收 Checklist 模板

每个项目交付时按这张表自查:

  • 本地起服务能跑通 1v1 / 多人通话
  • 公网部署后异网络用户能连上(含对称 NAT)
  • 4G ↔ Wi-Fi 切换 5s 内自愈(ICE Restart)
  • 房间鉴权失败拒绝加入
  • TURN 凭据短期 + 单用户限速
  • 控制台无未捕获 Promise rejection
  • getStats 关键字段(freezeCount、jitter、packetsLost)有上报
  • 弱网(200ms / 5% 丢包)下仍可通话
  • 关闭页面后无 ICE 心跳泄漏(看服务端日志)
  • README 一条命令能起来