297 lines
7.8 KiB
Markdown
297 lines
7.8 KiB
Markdown
|
# 视频推流和录制规则说明
|
|||
|
|
|||
|
## 概述
|
|||
|
|
|||
|
本文档详细说明了身体平衡评估系统的视频推流和录制功能规则,包括足部监视视频推流、深度相机视频推流、多路视频同步录制以及数据库存储规范。
|
|||
|
|
|||
|
## 功能架构
|
|||
|
|
|||
|
### 1. 视频推流功能
|
|||
|
|
|||
|
#### 1.1 推流类型
|
|||
|
- **足部监视视频推流**: 来自普通摄像头的足部监测画面
|
|||
|
- **深度相机视频推流**: 来自FemtoBolt深度相机的身体姿态画面
|
|||
|
|
|||
|
#### 1.2 推流技术规范
|
|||
|
- **传输协议**: WebSocket
|
|||
|
- **推流格式**: Base64编码的JPEG图像帧
|
|||
|
- **推流频率**: 30 FPS
|
|||
|
- **线程模式**: 独立线程处理,避免阻塞主程序
|
|||
|
- **目标端**: 前端Web页面实时显示
|
|||
|
|
|||
|
#### 1.3 推流实现方式
|
|||
|
```python
|
|||
|
# 足部监视视频推流线程
|
|||
|
def _camera_streaming_thread(self):
|
|||
|
# 从摄像头获取帧 → 编码 → WebSocket推送
|
|||
|
|
|||
|
# 深度相机视频推流线程
|
|||
|
def _femtobolt_streaming_thread(self):
|
|||
|
# 从FemtoBolt获取帧 → 编码 → WebSocket推送
|
|||
|
```
|
|||
|
|
|||
|
### 2. 视频录制功能
|
|||
|
|
|||
|
#### 2.1 录制类型
|
|||
|
根据`detection_sessions`表结构,系统需要同步录制三种视频:
|
|||
|
|
|||
|
1. **足部检测视频** (`normal_video_path`)
|
|||
|
- 数据源: 普通摄像头
|
|||
|
- 文件名: `feet.mp4`
|
|||
|
- 内容: 足部监测画面
|
|||
|
|
|||
|
2. **深度相机视频** (`femtobolt_video_path`)
|
|||
|
- 数据源: FemtoBolt深度相机
|
|||
|
- 文件名: `body.mp4`
|
|||
|
- 内容: 身体姿态深度画面
|
|||
|
|
|||
|
3. **屏幕录制视频** (`screen_video_path`)
|
|||
|
- 数据源: 前端界面录制
|
|||
|
- 文件名: `screen.mp4`
|
|||
|
- 内容: 完整的检测界面录制
|
|||
|
|
|||
|
#### 2.2 存储路径规范
|
|||
|
```
|
|||
|
基础路径: data/patients/{患者ID}/{sessionID}/
|
|||
|
├── feet.mp4 # 足部检测视频
|
|||
|
├── body.mp4 # 深度相机视频
|
|||
|
└── screen.mp4 # 屏幕录制视频
|
|||
|
```
|
|||
|
|
|||
|
#### 2.3 录制参数规范
|
|||
|
- **视频编码**: H.264 (mp4v)
|
|||
|
- **分辨率**:
|
|||
|
- 足部视频: 1280x720
|
|||
|
- 深度相机视频: 1920x1080 (根据FemtoBolt配置)
|
|||
|
- 屏幕录制: 根据前端界面尺寸
|
|||
|
- **帧率**: 30 FPS
|
|||
|
- **音频**: 不录制音频
|
|||
|
|
|||
|
## 核心方法设计
|
|||
|
|
|||
|
### 3.1 录制控制方法
|
|||
|
|
|||
|
#### 3.1.1 start_recording方法
|
|||
|
```python
|
|||
|
def start_recording(self, session_id: str, patient_id: str) -> Dict[str, bool]:
|
|||
|
"""
|
|||
|
同步启动三个视频录制功能
|
|||
|
|
|||
|
Args:
|
|||
|
session_id: 检测会话ID
|
|||
|
patient_id: 患者ID
|
|||
|
|
|||
|
Returns:
|
|||
|
Dict: 各录制任务的启动状态
|
|||
|
{
|
|||
|
'feet_recording': bool,
|
|||
|
'body_recording': bool,
|
|||
|
'screen_recording': bool,
|
|||
|
'session_updated': bool
|
|||
|
}
|
|||
|
"""
|
|||
|
```
|
|||
|
|
|||
|
**功能流程**:
|
|||
|
1. 创建录制目录: `data/patients/{patient_id}/{session_id}/`
|
|||
|
2. 初始化三个VideoWriter对象
|
|||
|
3. 启动三个录制线程
|
|||
|
4. 更新`detection_sessions`表的视频路径字段
|
|||
|
5. 返回启动状态
|
|||
|
|
|||
|
#### 3.1.2 stop_recording方法
|
|||
|
```python
|
|||
|
def stop_recording(self, session_id: str) -> Dict[str, Any]:
|
|||
|
"""
|
|||
|
同步停止所有视频录制
|
|||
|
|
|||
|
Args:
|
|||
|
session_id: 检测会话ID
|
|||
|
|
|||
|
Returns:
|
|||
|
Dict: 录制结果信息
|
|||
|
{
|
|||
|
'status': 'success'|'failed',
|
|||
|
'video_files': {
|
|||
|
'feet_video': str,
|
|||
|
'body_video': str,
|
|||
|
'screen_video': str
|
|||
|
},
|
|||
|
'file_sizes': Dict[str, int],
|
|||
|
'duration': int
|
|||
|
}
|
|||
|
"""
|
|||
|
```
|
|||
|
|
|||
|
**功能流程**:
|
|||
|
1. 停止所有录制线程
|
|||
|
2. 释放VideoWriter资源
|
|||
|
3. 检查录制文件完整性
|
|||
|
4. 更新`detection_sessions`表的结束时间和持续时间
|
|||
|
5. 返回录制结果
|
|||
|
|
|||
|
### 3.2 推流控制方法
|
|||
|
|
|||
|
#### 3.2.1 start_streaming方法
|
|||
|
```python
|
|||
|
def start_streaming(self) -> Dict[str, bool]:
|
|||
|
"""
|
|||
|
启动视频推流
|
|||
|
|
|||
|
Returns:
|
|||
|
Dict: 推流启动状态
|
|||
|
{
|
|||
|
'camera_streaming': bool,
|
|||
|
'femtobolt_streaming': bool
|
|||
|
}
|
|||
|
"""
|
|||
|
```
|
|||
|
|
|||
|
#### 3.2.2 stop_streaming方法
|
|||
|
```python
|
|||
|
def stop_streaming(self) -> bool:
|
|||
|
"""
|
|||
|
停止所有视频推流
|
|||
|
|
|||
|
Returns:
|
|||
|
bool: 停止操作是否成功
|
|||
|
"""
|
|||
|
```
|
|||
|
|
|||
|
## 数据库集成规范
|
|||
|
|
|||
|
### 4.1 detection_sessions表字段映射
|
|||
|
|
|||
|
| 字段名 | 数据类型 | 说明 | 录制对应 |
|
|||
|
|--------|----------|------|----------|
|
|||
|
| `normal_video_path` | TEXT | 足部检测视频路径 | `feet.mp4` |
|
|||
|
| `femtobolt_video_path` | TEXT | 深度相机视频路径 | `body.mp4` |
|
|||
|
| `screen_video_path` | TEXT | 屏幕录制视频路径 | `screen.mp4` |
|
|||
|
| `start_time` | TIMESTAMP | 检测开始时间 | 录制开始时间 |
|
|||
|
| `end_time` | TIMESTAMP | 检测结束时间 | 录制结束时间 |
|
|||
|
| `duration` | INTEGER | 检测持续时间(秒) | 录制持续时间 |
|
|||
|
| `status` | TEXT | 会话状态 | recording/completed |
|
|||
|
|
|||
|
### 4.2 数据库操作时机
|
|||
|
|
|||
|
#### 4.2.1 录制开始时
|
|||
|
```sql
|
|||
|
UPDATE detection_sessions SET
|
|||
|
normal_video_path = 'data/patients/{patient_id}/{session_id}/feet.mp4',
|
|||
|
femtobolt_video_path = 'data/patients/{patient_id}/{session_id}/body.mp4',
|
|||
|
screen_video_path = 'data/patients/{patient_id}/{session_id}/screen.mp4',
|
|||
|
start_time = CURRENT_TIMESTAMP,
|
|||
|
status = 'recording'
|
|||
|
WHERE id = '{session_id}'
|
|||
|
```
|
|||
|
|
|||
|
#### 4.2.2 录制结束时
|
|||
|
```sql
|
|||
|
UPDATE detection_sessions SET
|
|||
|
end_time = CURRENT_TIMESTAMP,
|
|||
|
duration = CAST((julianday(CURRENT_TIMESTAMP) - julianday(start_time)) * 86400 AS INTEGER),
|
|||
|
status = 'completed'
|
|||
|
WHERE id = '{session_id}'
|
|||
|
```
|
|||
|
|
|||
|
## 线程管理规范
|
|||
|
|
|||
|
### 5.1 推流线程
|
|||
|
- **线程名称**: `camera_streaming_thread`, `femtobolt_streaming_thread`
|
|||
|
- **线程类型**: daemon线程
|
|||
|
- **生命周期**: 与推流状态同步
|
|||
|
- **异常处理**: 线程内部捕获异常,记录日志,不影响主程序
|
|||
|
|
|||
|
### 5.2 录制线程
|
|||
|
- **线程名称**: `feet_recording_thread`, `body_recording_thread`, `screen_recording_thread`
|
|||
|
- **线程类型**: 非daemon线程,确保录制完整性
|
|||
|
- **同步机制**: 使用threading.Event控制启停
|
|||
|
- **资源管理**: 确保VideoWriter正确释放
|
|||
|
|
|||
|
## 错误处理和异常情况
|
|||
|
|
|||
|
### 6.1 设备异常处理
|
|||
|
- 摄像头断开: 停止对应推流/录制,记录错误日志
|
|||
|
- FemtoBolt设备异常: 降级到普通摄像头模式
|
|||
|
- 存储空间不足: 停止录制,保存已录制内容
|
|||
|
|
|||
|
### 6.2 网络异常处理
|
|||
|
- WebSocket连接断开: 自动重连机制
|
|||
|
- 推流延迟过高: 降低推流质量或帧率
|
|||
|
|
|||
|
### 6.3 文件系统异常
|
|||
|
- 目录创建失败: 使用备用路径
|
|||
|
- 文件写入失败: 记录错误,尝试恢复
|
|||
|
- 磁盘空间监控: 预警机制
|
|||
|
|
|||
|
## 性能优化策略
|
|||
|
|
|||
|
### 7.1 内存管理
|
|||
|
- 帧缓冲区大小限制
|
|||
|
- 及时释放图像数据
|
|||
|
- 内存使用监控
|
|||
|
|
|||
|
### 7.2 CPU优化
|
|||
|
- 多线程并行处理
|
|||
|
- 图像编码优化
|
|||
|
- 帧率自适应调整
|
|||
|
|
|||
|
### 7.3 存储优化
|
|||
|
- 视频压缩参数调优
|
|||
|
- 分段录制避免大文件
|
|||
|
- 异步写入机制
|
|||
|
|
|||
|
## 配置参数
|
|||
|
|
|||
|
### 8.1 推流配置
|
|||
|
```python
|
|||
|
STREAMING_CONFIG = {
|
|||
|
'fps': 30,
|
|||
|
'quality': 80, # JPEG质量
|
|||
|
'max_frame_buffer': 10,
|
|||
|
'reconnect_interval': 5 # 秒
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 8.2 录制配置
|
|||
|
```python
|
|||
|
RECORDING_CONFIG = {
|
|||
|
'fps': 30,
|
|||
|
'codec': 'mp4v',
|
|||
|
'max_file_size': 1024 * 1024 * 1024, # 1GB
|
|||
|
'segment_duration': 600 # 10分钟分段
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 测试验证
|
|||
|
|
|||
|
### 9.1 功能测试
|
|||
|
- [ ] 单独推流测试
|
|||
|
- [ ] 同步录制测试
|
|||
|
- [ ] 数据库更新测试
|
|||
|
- [ ] 异常恢复测试
|
|||
|
|
|||
|
### 9.2 性能测试
|
|||
|
- [ ] 长时间录制稳定性
|
|||
|
- [ ] 多路并发性能
|
|||
|
- [ ] 内存泄漏检测
|
|||
|
- [ ] 存储空间使用
|
|||
|
|
|||
|
### 9.3 兼容性测试
|
|||
|
- [ ] 不同设备组合
|
|||
|
- [ ] 不同分辨率支持
|
|||
|
- [ ] 浏览器兼容性
|
|||
|
|
|||
|
## 部署注意事项
|
|||
|
|
|||
|
1. **依赖库**: 确保OpenCV、WebSocket库版本兼容
|
|||
|
2. **权限设置**: 摄像头访问权限、文件写入权限
|
|||
|
3. **防火墙**: WebSocket端口开放
|
|||
|
4. **存储规划**: 预估存储空间需求
|
|||
|
5. **备份策略**: 重要录制文件的备份机制
|
|||
|
|
|||
|
---
|
|||
|
|
|||
|
*本文档版本: 1.0*
|
|||
|
*最后更新: 2025年08月03日*
|
|||
|
*维护人员: 系统开发团队*
|