436 lines
13 KiB
Markdown
436 lines
13 KiB
Markdown
|
|
# 屏幕监控实现方法汇总
|
|||
|
|
|
|||
|
|
## 📋 概述
|
|||
|
|
本项目支持多种屏幕监控实现方式,适用于不同的运行环境和需求场景。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法一:WebSocket + 截图方式(当前使用)
|
|||
|
|
|
|||
|
|
### 实现位置
|
|||
|
|
- **学生端**: `fronted_uniapp/fronted_uniapp/utils/screenStream.js`
|
|||
|
|
- **管理员端**: `Study-Vue-redis/ry-study-ui/src/views/study/screenStream/index.vue`
|
|||
|
|
- **后端**: `Study-Vue-redis/ry-study-admin/src/main/java/com/ddnai/web/websocket/ScreenStreamWebSocketHandler.java`
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 学生端通过 WebSocket 连接到 `/ws/screenStream/{userId}`
|
|||
|
|
2. 学生端使用 `plus.screen.capture` 或 `plus.nativeObj.Bitmap` 进行屏幕截图
|
|||
|
|
3. 将截图转换为 Base64 格式,通过 WebSocket 发送给后端
|
|||
|
|
4. 后端转发给监控端(管理员界面)
|
|||
|
|
5. 监控端接收并显示截图画面
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 适用于 App 环境(HBuilder/UniApp)
|
|||
|
|
- ✅ 实现简单,兼容性好
|
|||
|
|
- ✅ 支持按需截图(`request_screenshot` 消息)
|
|||
|
|
- ✅ 支持持续截图(定时发送)
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 延迟较高(取决于截图间隔)
|
|||
|
|
- ❌ 数据量大(Base64 编码的图片)
|
|||
|
|
- ❌ 需要 App 权限(屏幕录制权限)
|
|||
|
|
|
|||
|
|
### 截图方式
|
|||
|
|
1. **plus.screen.capture**(优先)
|
|||
|
|
2. **plus.nativeObj.Bitmap + webview.draw**(备选)
|
|||
|
|
3. **Canvas API**(H5 环境,功能有限)
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 手机 App 环境
|
|||
|
|
- ✅ 需要实时监控学生屏幕
|
|||
|
|
- ✅ 网络带宽充足
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法二:WebRTC 屏幕共享(H5环境)
|
|||
|
|
|
|||
|
|
### 实现位置
|
|||
|
|
- **学生端**: `fronted_uniapp/src/utils/webrtc.js`
|
|||
|
|
- **管理员端**: `Study-Vue-redis/ry-study-ui/src/utils/webrtc.js`
|
|||
|
|
- **后端**: `Study-Vue-redis/ry-study-admin/src/main/java/com/ddnai/web/websocket/WebRTCSignalingHandler.java`
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 学生端使用 `navigator.mediaDevices.getDisplayMedia()` 获取屏幕流
|
|||
|
|
2. 通过 WebRTC 信令服务器(`/ws/webrtc/{userId}`)建立 P2P 连接
|
|||
|
|
3. 学生端创建 RTCPeerConnection,发送 offer
|
|||
|
|
4. 监控端接收 offer,创建 answer
|
|||
|
|
5. 交换 ICE candidates,建立媒体流传输
|
|||
|
|
6. 监控端接收并显示实时视频流
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 延迟极低(实时视频流)
|
|||
|
|
- ✅ 数据量小(视频编码压缩)
|
|||
|
|
- ✅ 画质好(原生视频流)
|
|||
|
|
- ✅ 无需 App 权限(浏览器原生支持)
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 仅支持 H5 环境(浏览器)
|
|||
|
|
- ❌ 需要 STUN/TURN 服务器(NAT 穿透)
|
|||
|
|
- ❌ 实现复杂(信令交换、ICE 协商)
|
|||
|
|
- ❌ 移动端浏览器支持有限
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 浏览器环境(PC/移动浏览器)
|
|||
|
|
- ✅ 需要低延迟实时监控
|
|||
|
|
- ✅ 网络环境良好(支持 P2P)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法三:HTTP 上传截图(传统方式)
|
|||
|
|
|
|||
|
|
### 实现位置
|
|||
|
|
- **学生端**: `fronted_uniapp/src/utils/monitor.js` / `fronted_uniapp/fronted_uniapp/utils/monitor.js`
|
|||
|
|
- **后端**: `Study-Vue-redis/ry-study-system/src/main/java/com/ddnai/system/service/impl/study/StudyScreenMonitorServiceImpl.java`
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 学生端定时截图(默认 30 秒)
|
|||
|
|
2. 将截图保存为文件
|
|||
|
|
3. 通过 HTTP POST 上传到 `/study/monitor/screenshot`
|
|||
|
|
4. 后端保存到数据库或文件系统
|
|||
|
|
5. 管理员通过历史记录查看
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 实现简单
|
|||
|
|
- ✅ 数据持久化(可查看历史)
|
|||
|
|
- ✅ 不依赖 WebSocket 连接
|
|||
|
|
- ✅ 适合离线场景(可延迟上传)
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 非实时(定时上传)
|
|||
|
|
- ❌ 数据量大(文件上传)
|
|||
|
|
- ❌ 需要存储空间
|
|||
|
|
- ❌ 无法实时监控
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 需要历史记录
|
|||
|
|
- ✅ 离线学习场景
|
|||
|
|
- ✅ 不需要实时监控
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法四:WebSocket + 监控端点(旧版)
|
|||
|
|
|
|||
|
|
### 实现位置
|
|||
|
|
- **后端**: `Study-Vue-redis/ry-study-admin/src/main/java/com/ddnai/web/websocket/MonitorWebSocketHandler.java`
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 学生端和监控端分别连接到 `/ws/monitor/{userId}`
|
|||
|
|
2. 通过 WebSocket 发送消息
|
|||
|
|
3. 后端广播消息给所有连接
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 实现简单
|
|||
|
|
- ✅ 支持多端连接
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 功能有限(仅消息传递)
|
|||
|
|
- ❌ 未实现屏幕流传输
|
|||
|
|
- ❌ 已废弃(被方法一替代)
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ❌ 不推荐使用(已废弃)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 方法对比表
|
|||
|
|
|
|||
|
|
| 特性 | WebSocket截图 | WebRTC | HTTP上传 | 监控端点 |
|
|||
|
|
|------|--------------|--------|----------|---------|
|
|||
|
|
| **实时性** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐ |
|
|||
|
|
| **延迟** | 高(1-2秒) | 极低(<100ms) | 高(30秒+) | 中 |
|
|||
|
|
| **数据量** | 大(Base64图片) | 小(视频编码) | 大(文件) | 小 |
|
|||
|
|
| **适用环境** | App | H5浏览器 | 所有 | 所有 |
|
|||
|
|
| **实现复杂度** | 中 | 高 | 低 | 低 |
|
|||
|
|
| **权限要求** | 屏幕录制 | 无 | 屏幕录制 | 无 |
|
|||
|
|
| **网络要求** | 中 | 高(P2P) | 低 | 中 |
|
|||
|
|
| **历史记录** | ❌ | ❌ | ✅ | ❌ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔧 当前实现状态
|
|||
|
|
|
|||
|
|
### ✅ 已实现
|
|||
|
|
1. **WebSocket + 截图方式**(方法一)
|
|||
|
|
- 学生端:✅ 已实现
|
|||
|
|
- 管理员端:✅ 已实现
|
|||
|
|
- 后端:✅ 已实现
|
|||
|
|
- 状态:✅ **当前使用中**
|
|||
|
|
|
|||
|
|
2. **WebRTC 屏幕共享**(方法二)
|
|||
|
|
- 学生端:✅ 已实现(H5环境)
|
|||
|
|
- 管理员端:✅ 已实现
|
|||
|
|
- 后端:✅ 已实现
|
|||
|
|
- 状态:⚠️ 仅 H5 环境可用
|
|||
|
|
|
|||
|
|
3. **HTTP 上传截图**(方法三)
|
|||
|
|
- 学生端:✅ 已实现
|
|||
|
|
- 后端:✅ 已实现
|
|||
|
|
- 状态:✅ 可用(历史记录)
|
|||
|
|
|
|||
|
|
### ⚠️ 部分实现
|
|||
|
|
- WebRTC 在 App 环境不可用(需要原生插件)
|
|||
|
|
|
|||
|
|
### ❌ 未实现
|
|||
|
|
- 无
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🚀 推荐方案
|
|||
|
|
|
|||
|
|
### 场景一:手机 App 环境(当前场景)
|
|||
|
|
**推荐:方法一(WebSocket + 截图)**
|
|||
|
|
- 已在登录时自动启动
|
|||
|
|
- 支持按需截图和持续截图
|
|||
|
|
- 适配 App 环境
|
|||
|
|
|
|||
|
|
### 场景二:浏览器环境
|
|||
|
|
**推荐:方法二(WebRTC)**
|
|||
|
|
- 低延迟实时监控
|
|||
|
|
- 画质好
|
|||
|
|
- 无需额外权限
|
|||
|
|
|
|||
|
|
### 场景三:需要历史记录
|
|||
|
|
**推荐:方法三(HTTP上传)**
|
|||
|
|
- 数据持久化
|
|||
|
|
- 可查看历史截图
|
|||
|
|
|
|||
|
|
### 场景四:生产环境(推荐)
|
|||
|
|
**推荐:方法五(第三方SDK)**
|
|||
|
|
- 使用腾讯云TRTC或ZEGO即构科技
|
|||
|
|
- 低延迟、高质量、稳定可靠
|
|||
|
|
- 适合大规模部署
|
|||
|
|
- 费用:按使用量计费(通常有免费额度)
|
|||
|
|
|
|||
|
|
### 场景五:混合方案(最佳体验)
|
|||
|
|
**推荐:方法七(混合方案)**
|
|||
|
|
- 浏览器优先使用 WebRTC
|
|||
|
|
- App 环境优先使用第三方SDK,降级到截图方式
|
|||
|
|
- 自动检测和切换
|
|||
|
|
- 最佳用户体验
|
|||
|
|
|
|||
|
|
### 场景六:完全自定义
|
|||
|
|
**推荐:方法六(原生插件)**
|
|||
|
|
- 开发原生插件
|
|||
|
|
- 完全控制实现
|
|||
|
|
- 无第三方依赖
|
|||
|
|
- 适合有原生开发能力的团队
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔍 问题排查
|
|||
|
|
|
|||
|
|
### 问题:管理员界面看不到画面
|
|||
|
|
|
|||
|
|
#### 可能原因
|
|||
|
|
1. **学生端未连接 WebSocket**
|
|||
|
|
- 检查:学生端控制台是否有 `✅ WebSocket 连接已建立`
|
|||
|
|
- 解决:确保登录后自动启动连接
|
|||
|
|
|
|||
|
|
2. **截图功能不可用**
|
|||
|
|
- 检查:学生端控制台是否有 `⚠️ 所有截图方式都不可用`
|
|||
|
|
- 解决:检查 App 权限配置(manifest.json)
|
|||
|
|
|
|||
|
|
3. **后端未转发截图请求**
|
|||
|
|
- 检查:后端日志是否有 `📸 监控端请求截图`
|
|||
|
|
- 解决:确保后端已实现 `handleRequestScreenshot` 方法
|
|||
|
|
|
|||
|
|
4. **网络连接问题**
|
|||
|
|
- 检查:WebSocket 连接是否成功
|
|||
|
|
- 解决:检查 IP 地址和端口配置
|
|||
|
|
|
|||
|
|
#### 调试步骤
|
|||
|
|
1. 检查学生端 WebSocket 连接状态
|
|||
|
|
2. 检查后端是否收到 `request_screenshot` 消息
|
|||
|
|
3. 检查学生端是否收到并响应截图请求
|
|||
|
|
4. 检查后端是否转发 `screen_frame` 消息
|
|||
|
|
5. 检查管理员端是否收到并显示画面
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 代码位置索引
|
|||
|
|
|
|||
|
|
### 学生端
|
|||
|
|
- `fronted_uniapp/fronted_uniapp/utils/screenStream.js` - 截图方式(App)
|
|||
|
|
- `fronted_uniapp/src/utils/webrtc.js` - WebRTC方式(H5)
|
|||
|
|
- `fronted_uniapp/fronted_uniapp/utils/monitor.js` - HTTP上传方式
|
|||
|
|
|
|||
|
|
### 管理员端
|
|||
|
|
- `Study-Vue-redis/ry-study-ui/src/views/study/screenStream/index.vue` - 监控界面
|
|||
|
|
- `Study-Vue-redis/ry-study-ui/src/utils/webrtc.js` - WebRTC客户端
|
|||
|
|
|
|||
|
|
### 后端
|
|||
|
|
- `ScreenStreamWebSocketHandler.java` - WebSocket截图方式处理器
|
|||
|
|
- `WebRTCSignalingHandler.java` - WebRTC信令处理器
|
|||
|
|
- `MonitorWebSocketHandler.java` - 旧版监控处理器(已废弃)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法五:第三方SDK(推荐用于生产环境)
|
|||
|
|
|
|||
|
|
### 可选SDK
|
|||
|
|
1. **腾讯云 TRTC(实时音视频)**
|
|||
|
|
- 官网:https://cloud.tencent.com/product/trtc
|
|||
|
|
- 支持:Android、iOS、Web
|
|||
|
|
- 特点:低延迟、高质量、稳定可靠
|
|||
|
|
- 费用:按使用量计费
|
|||
|
|
|
|||
|
|
2. **ZEGO即构科技(实时音视频)**
|
|||
|
|
- 官网:https://www.zego.im/
|
|||
|
|
- 支持:Android、iOS、Web
|
|||
|
|
- 特点:低延迟、全球节点、SDK完善
|
|||
|
|
- 费用:按使用量计费
|
|||
|
|
|
|||
|
|
3. **声网 Agora(实时音视频)**
|
|||
|
|
- 官网:https://www.agora.io/
|
|||
|
|
- 支持:Android、iOS、Web
|
|||
|
|
- 特点:低延迟、高并发、全球覆盖
|
|||
|
|
- 费用:按使用量计费
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 集成第三方SDK到App中
|
|||
|
|
2. 使用SDK提供的屏幕录制API
|
|||
|
|
3. 通过SDK的服务器进行实时传输
|
|||
|
|
4. 管理员端通过SDK接收视频流
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 低延迟(<100ms)
|
|||
|
|
- ✅ 高质量(视频编码)
|
|||
|
|
- ✅ 稳定可靠(专业服务)
|
|||
|
|
- ✅ 支持大规模并发
|
|||
|
|
- ✅ 完善的SDK和文档
|
|||
|
|
- ✅ 无需自己维护服务器
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 需要付费(按使用量)
|
|||
|
|
- ❌ 依赖第三方服务
|
|||
|
|
- ❌ 需要集成SDK(增加包体积)
|
|||
|
|
- ❌ 需要申请账号和配置
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 生产环境
|
|||
|
|
- ✅ 需要高质量实时监控
|
|||
|
|
- ✅ 有预算支持
|
|||
|
|
- ✅ 需要大规模部署
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法六:原生插件(自定义开发)
|
|||
|
|
|
|||
|
|
### 实现方式
|
|||
|
|
1. **Android原生插件**
|
|||
|
|
- 使用 MediaProjection API(Android 5.0+)
|
|||
|
|
- 使用 ScreenCapture API(Android 10+)
|
|||
|
|
- 开发 UniApp 原生插件
|
|||
|
|
|
|||
|
|
2. **iOS原生插件**
|
|||
|
|
- 使用 ReplayKit Framework
|
|||
|
|
- 开发 UniApp 原生插件
|
|||
|
|
|
|||
|
|
### 工作原理
|
|||
|
|
1. 开发原生插件封装系统API
|
|||
|
|
2. 在UniApp中调用插件
|
|||
|
|
3. 获取屏幕流并编码
|
|||
|
|
4. 通过WebSocket或WebRTC传输
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 完全控制(自定义实现)
|
|||
|
|
- ✅ 性能优化(原生代码)
|
|||
|
|
- ✅ 无第三方依赖
|
|||
|
|
- ✅ 可定制化
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 开发成本高(需要原生开发)
|
|||
|
|
- ❌ 维护成本高
|
|||
|
|
- ❌ 需要处理平台差异
|
|||
|
|
- ❌ 需要审核(iOS)
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 有原生开发能力
|
|||
|
|
- ✅ 需要完全控制
|
|||
|
|
- ✅ 不想依赖第三方服务
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 方法七:混合方案(推荐)
|
|||
|
|
|
|||
|
|
### 实现策略
|
|||
|
|
1. **自动检测环境**
|
|||
|
|
- App环境:优先使用第三方SDK,降级到截图方式
|
|||
|
|
- H5环境:优先使用WebRTC,降级到截图方式
|
|||
|
|
|
|||
|
|
2. **智能降级**
|
|||
|
|
- 检测网络质量
|
|||
|
|
- 检测设备性能
|
|||
|
|
- 自动选择最优方案
|
|||
|
|
|
|||
|
|
3. **方案切换**
|
|||
|
|
- 支持手动切换
|
|||
|
|
- 支持自动切换(根据条件)
|
|||
|
|
|
|||
|
|
### 优点
|
|||
|
|
- ✅ 兼容性好(多方案支持)
|
|||
|
|
- ✅ 性能最优(自动选择)
|
|||
|
|
- ✅ 用户体验好(无缝切换)
|
|||
|
|
|
|||
|
|
### 缺点
|
|||
|
|
- ❌ 实现复杂(多方案集成)
|
|||
|
|
- ❌ 测试工作量大
|
|||
|
|
|
|||
|
|
### 使用场景
|
|||
|
|
- ✅ 需要支持多种环境
|
|||
|
|
- ✅ 需要最佳用户体验
|
|||
|
|
- ✅ 有开发资源
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 完整方法对比表
|
|||
|
|
|
|||
|
|
| 特性 | WebSocket截图 | WebRTC | HTTP上传 | 第三方SDK | 原生插件 | 混合方案 |
|
|||
|
|
|------|--------------|--------|----------|----------|---------|---------|
|
|||
|
|
| **实时性** | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|||
|
|
| **延迟** | 高(1-2秒) | 极低(<100ms) | 高(30秒+) | 极低(<100ms) | 极低(<100ms) | 极低(<100ms) |
|
|||
|
|
| **数据量** | 大(Base64图片) | 小(视频编码) | 大(文件) | 小(视频编码) | 小(视频编码) | 小(视频编码) |
|
|||
|
|
| **适用环境** | App | H5浏览器 | 所有 | 所有 | App | 所有 |
|
|||
|
|
| **实现复杂度** | 中 | 高 | 低 | 低 | 高 | 很高 |
|
|||
|
|
| **权限要求** | 屏幕录制 | 无 | 屏幕录制 | 屏幕录制 | 屏幕录制 | 屏幕录制 |
|
|||
|
|
| **网络要求** | 中 | 高(P2P) | 低 | 中 | 中 | 中 |
|
|||
|
|
| **成本** | 免费 | 免费 | 免费 | 付费 | 免费 | 付费/免费 |
|
|||
|
|
| **稳定性** | 中 | 中 | 高 | 高 | 中 | 高 |
|
|||
|
|
| **历史记录** | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🎯 下一步优化建议
|
|||
|
|
|
|||
|
|
1. **优化截图性能**
|
|||
|
|
- 降低截图频率(当前 1 秒/帧)
|
|||
|
|
- 优化图片压缩算法
|
|||
|
|
- 使用更高效的编码格式
|
|||
|
|
|
|||
|
|
2. **增强 WebRTC 支持**
|
|||
|
|
- 开发 App 环境的 WebRTC 原生插件
|
|||
|
|
- 配置 TURN 服务器(NAT 穿透)
|
|||
|
|
|
|||
|
|
3. **集成第三方SDK**
|
|||
|
|
- 评估并选择适合的SDK(TRTC/ZEGO/Agora)
|
|||
|
|
- 开发SDK集成方案
|
|||
|
|
- 实现自动降级机制
|
|||
|
|
|
|||
|
|
4. **混合方案**
|
|||
|
|
- 自动检测环境,选择最优方案
|
|||
|
|
- 支持方案切换和降级
|
|||
|
|
|
|||
|
|
5. **历史记录**
|
|||
|
|
- 集成 HTTP 上传方式
|
|||
|
|
- 提供历史截图查看功能
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📚 相关文档
|
|||
|
|
|
|||
|
|
- WebSocket API: https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket
|
|||
|
|
- WebRTC API: https://developer.mozilla.org/zh-CN/docs/Web/API/WebRTC_API
|
|||
|
|
- UniApp 截图: https://uniapp.dcloud.net.cn/api/media/screen.html
|
|||
|
|
- HBuilder Plus API: https://www.html5plus.org/doc/zh_cn/device.html
|
|||
|
|
|