guoyu/Study-Vue-redis/WebRTC迁移说明.md
2025-12-03 18:58:36 +08:00

163 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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.

# WebRTC 迁移说明
## 概述
已将实时监控功能从 **WebSocket + 截图** 方案迁移到 **WebRTC** 技术,实现更低延迟和更高效率的屏幕流传输。
## 技术架构
### 1. 信令服务器(后端)
- **文件**: `WebRTCSignalingHandler.java`
- **路径**: `/ws/webrtc/{userId}`
- **功能**: 处理 WebRTC 信令交换offer/answer/ICE candidate
### 2. 学生端(前端 UniApp
- **文件**: `fronted_uniapp/src/utils/webrtc.js`
- **功能**:
- 使用 `getDisplayMedia()` 获取屏幕流
- 创建 RTCPeerConnection
- 发送屏幕流给监控端
### 3. 监控端(后端管理界面)
- **文件**: `Study-Vue-redis/study-ui/src/utils/webrtc.js`
- **功能**:
- 接收学生的屏幕流
-`<video>` 元素中显示实时视频
## 工作流程
```
1. 学生端:
- 连接信令服务器 (/ws/webrtc/{userId})
- 获取屏幕流 (getDisplayMedia)
- 创建 PeerConnection
- 发送 offer
2. 信令服务器:
- 接收学生端的 offer
- 转发给所有监控该学生的监控端
3. 监控端:
- 连接信令服务器 (/ws/webrtc/{studentId})
- 接收学生端的 offer
- 创建 answer
- 发送 answer 给学生端
4. 双方交换 ICE candidates建立 P2P 连接
5. 学生端屏幕流通过 WebRTC 传输到监控端
```
## 文件变更
### 新增文件
1. `Study-Vue-redis/ry-study-admin/src/main/java/com/ddnai/web/websocket/WebRTCSignalingHandler.java`
- WebRTC 信令服务器
2. `fronted_uniapp/src/utils/webrtc.js`
- 学生端 WebRTC 客户端
3. `Study-Vue-redis/study-ui/src/utils/webrtc.js`
- 监控端 WebRTC 客户端
### 修改文件
1. `fronted_uniapp/src/pages/course/detail.vue`
- 添加 WebRTC 支持H5 环境优先使用 WebRTC
2. `Study-Vue-redis/study-ui/src/views/study/screenStream/index.vue`
- 添加 WebRTC 视频显示
- 优先使用 WebRTC失败时回退到截图方式
3. `Study-Vue-redis/ry-study-admin/src/main/java/com/ddnai/web/controller/study/ScreenStreamController.java`
- 合并 WebRTC 和 WebSocket 的在线状态查询
## 兼容性
### 自动回退机制
- **H5 环境**: 优先使用 WebRTC失败时自动回退到截图方式
- **App 环境**: 使用截图方式WebRTC 在 App 中需要额外配置)
### 浏览器支持
- Chrome/Edge: ✅ 完全支持
- Firefox: ✅ 完全支持
- Safari: ⚠️ 部分支持(需要用户手动授权)
- 移动浏览器: ⚠️ 支持有限
## STUN/TURN 服务器配置
当前使用 Google 的公共 STUN 服务器:
```javascript
iceServers: [
{ urls: 'stun:stun.l.google.com:19302' },
{ urls: 'stun:stun1.l.google.com:19302' }
]
```
### 如果需要配置 TURN 服务器(用于 NAT 穿透)
在以下文件中修改 `iceServers` 配置:
- `fronted_uniapp/src/utils/webrtc.js`
- `Study-Vue-redis/study-ui/src/utils/webrtc.js`
添加 TURN 服务器:
```javascript
{
urls: 'turn:your-turn-server.com:3478',
username: 'your-username',
credential: 'your-password'
}
```
## 使用说明
### 学生端
1. 登录并进入课程详情页面
2. 系统自动启动 WebRTC 屏幕共享H5 环境)
3. 浏览器会弹出权限请求,选择要共享的屏幕/窗口
### 监控端
1. 进入实时监控页面 (`/study/screenStream`)
2. 选择在线学生
3. 系统自动连接 WebRTC 并显示实时视频流
## 优势对比
| 特性 | WebSocket + 截图 | WebRTC |
|------|----------------|--------|
| 延迟 | 500ms+ | <100ms |
| 带宽效率 | 每帧完整图片 | 视频编码压缩 |
| 帧率 | 2 FPS | 30 FPS |
| 画质 | 静态图片 | 流畅视频 |
| 实现复杂度 | 简单 | 中等 |
## 注意事项
1. **HTTPS 要求**: WebRTC `getDisplayMedia()` API 在大多数浏览器中需要 HTTPS 环境
2. **权限请求**: 用户需要授权屏幕共享权限
3. **NAT 穿透**: 如果双方都在 NAT 后面可能需要 TURN 服务器
4. **浏览器兼容性**: 确保使用现代浏览器Chrome 72+, Firefox 66+, Safari 13+
## 故障排查
### 学生端无法启动 WebRTC
- 检查浏览器是否支持 `getDisplayMedia`
- 检查是否在 HTTPS 环境 localhost
- 查看控制台错误信息
### 监控端无法接收视频流
- 检查信令服务器连接是否正常
- 检查 ICE 连接状态
- 查看浏览器控制台和网络标签页
### 连接建立但无画面
- 检查 STUN/TURN 服务器配置
- 检查防火墙设置
- 尝试配置 TURN 服务器
## 后续优化建议
1. 添加 TURN 服务器支持提高 NAT 穿透成功率
2. 实现自适应码率根据网络状况调整画质
3. 添加音频支持如果需要
4. 优化移动端支持