Skip to the content.

📹 WebRTC

基于 Go 的 WebRTC 实时音视频示例项目
从一对一通话到多人 Mesh 房间,覆盖 WebRTC 核心能力的学习与实践

Go CI Pages License: MIT Go WebRTC Docker

功能全景

🔌

WebSocket 信令

Gorilla WebSocket 实现房间内 Offer/Answer/ICE Candidate 转发,支持心跳保活机制

🎥

媒体控制

静音/取消静音、摄像头开关、屏幕共享(getDisplayMedia

💬

DataChannel

点对点文本聊天,无需服务器中转,低延迟消息传递

🎬

本地录制

MediaRecorder 录制音视频流,导出 .webm 格式下载

👥

多人 Mesh

房间成员列表广播,多 PeerConnection 管理,网格视频布局

🐳

Docker 部署

多阶段 Dockerfile,Go 编译 + 静态前端打包,镜像体积最小化

开发路线图

阶段 能力 状态
阶段 1 — 基础通话 一对一通话、连接状态展示、错误处理、心跳保活 已完成
阶段 2 — 媒体控制 静音/摄像头开关、屏幕共享、DataChannel 文本聊天、本地录制 已完成
阶段 3 — 多人房间 房间成员列表、自动呼叫提示、小规模 Mesh 多人通话 已完成
阶段 4 — 容器部署 Docker 多阶段构建、环境变量配置 已完成
计划中 TURN 支持(coturn)、HTTPS/WSS 反向代理 规划中

架构总览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌────────────────────────────────────────────────────────────┐
│  浏览器 A                                                   │
│  ┌────────┐    ┌──────────┐    ┌────────────────────┐     │
│  │HTML UI │──→ │  app.js  │──→ │   getUserMedia     │     │
│  └────────┘    └────┬─────┘    └─────────┬──────────┘     │
└─────────────────────┼────────────────────┼────────────────┘
                      │ WebSocket          │ WebRTC P2P
               ┌──────▼──────┐             │
               │  Go 信令服务  │             │
               │ ┌─────────┐ │             │
               │ │Hub/房间 │ │             │
               │ │管理     │ │             │
               │ └─────────┘ │             │
               └──────┬──────┘             │
                      │ WebSocket          │
┌─────────────────────┼────────────────────┼────────────────┐
│  浏览器 B           │                    │                │
│  ┌────────┐    ┌────▼──────┐    ┌───────▼────────────┐   │
│  │HTML UI │──→ │  app.js   │──→ │   getUserMedia     │   │
│  └────────┘    └───────────┘    └────────────────────┘   │
└────────────────────────────────────────────────────────────┘

快速开始

📋 环境要求

🖥️ 本地运行

1
2
3
4
5
6
7
8
9
10
11
12
# 克隆仓库
git clone https://github.com/LessUp/webrtc.git
cd webrtc

# (可选) 国内代理
go env -w GOPROXY=https://goproxy.cn,direct

# 安装依赖并启动
go mod tidy
go run ./cmd/server

# 浏览器访问 http://localhost:8080

🐳 Docker 运行

1
2
3
4
5
# 构建镜像
docker build -t webrtc .

# 运行容器
docker run --rm -p 8080:8080 webrtc

📱 使用步骤

  1. 打开两个浏览器窗口,访问 http://localhost:8080
  2. 输入相同房间名并点击 Join
  3. 点击左侧成员列表中的对端 ID(或手动输入),然后点击 Call
  4. 允许摄像头/麦克风权限,即可看到远端视频
  5. 通话建立后可进行文本聊天、屏幕共享与本地录制
💡 提示

确保两个浏览器访问的是同一网络地址(或配置好 STUN/TURN 服务器),WebRTC P2P 才能成功建立连接。


文档导航

📚

技术指南

项目整体架构、前端实现、媒体控制、录制等技术详解

📡

信令协议

信令与房间管理的深入讲解,含时序图与代码示例

🚀

部署指南

Docker 部署、HTTPS/WSS 配置、生产环境最佳实践

🔧

故障排除

常见问题与解决方案,帮助快速定位和修复问题

🗺️

开发路线图

各阶段开发计划、功能规划和未来发展方向

🤝

贡献指南

开发流程、代码规范、提交信息格式和 PR 流程


技术栈

类别 技术
后端 Go 1.22+、net/http、Gorilla WebSocket
前端 HTML5 + Vanilla JavaScript + CSS3
媒体 WebRTC(getUserMedia、RTCPeerConnection、DataChannel、MediaRecorder)
容器 Docker(multi-stage build)
CI/CD GitHub Actions(Go 多版本测试 + staticcheck + GitHub Pages 部署)

项目结构

1
2
3
4
5
6
7
8
9
webrtc/
├── cmd/server/          # HTTP + WebSocket 服务入口
├── internal/signal/     # 信令逻辑(Hub、Client、Message)
├── web/                 # 浏览器前端(HTML/JS/CSS)
├── docs/                # 技术文档
├── specs/               # 规范文档(产品/RFC/API/DB/测试)
├── changelog/           # 变更日志
├── deploy/              # 部署配置
└── Dockerfile           # 多阶段构建

开源协议

本项目基于 MIT License 开源。

觉得这个项目有帮助?

⭐ Star on GitHub

Made with ❤️ by LessUp