2025-12-02 18:54:14 +08:00

176 lines
5.1 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.

# 技术设计文档
## 上下文
项目需要实现视频内容分析和总结功能,使用阿里云 DashScope 多模态 API 进行视频解析。系统需要支持视频上传、内容解析、自动总结以及多视频对比功能。
## 目标 / 非目标
### 目标
- 提供 RESTful API 用于视频文件上传和管理
- 集成阿里云 DashScope API 进行视频内容解析
- 自动生成视频内容总结
- 支持多个视频之间的内容对比
- 使用 MongoDB 持久化存储视频元数据和分析结果
- 提供简洁的静态前端页面进行交互
### 非目标
- 视频流式处理(当前仅支持文件上传)
- 实时视频分析(异步处理)
- 视频编辑功能
- 用户认证和权限管理(当前版本)
## 决策
### 1. 后端框架Python Flask
**决策**:使用 Python Flask 构建 RESTful API 后端
**原因**
- Python 对 AI/ML 生态支持良好DashScope SDK 为 Python 原生
- Flask 轻量级,适合快速开发 RESTful API
- 易于集成第三方服务
**考虑的替代方案**
- FastAPI性能更好但 Flask 更简单直接
- Django功能完整但过于重量级
### 2. 数据库MongoDB
**决策**:使用 MongoDB 存储视频元数据和分析结果
**原因**
- 文档数据库适合存储非结构化的分析结果
- 灵活的 schema 便于扩展
- 项目已有 MongoDB 配置
**考虑的替代方案**
- PostgreSQL关系型数据库但分析结果结构可能变化
- SQLite轻量但不适合生产环境
### 3. 视频解析服务:阿里云 DashScope
**决策**:使用 DashScope MultiModalConversation APIqwen3-vl-plus 模型)
**原因**
- 官方提供的多模态视频理解能力
- 支持视频抽帧分析fps 参数)
- API 调用简单,集成方便
**配置要点**
- fps 参数控制抽帧频率(默认 2即每 0.5 秒一帧)
- API Key 通过环境变量或配置文件管理
- 需要处理 API 调用失败和重试
### 4. 文件存储:本地文件系统
**决策**:使用本地 uploads/ 目录存储视频文件
**原因**
- 简单直接,无需额外服务
- 适合中小规模部署
**考虑的替代方案**
- 对象存储OSS/S3适合大规模部署但增加复杂度
- 数据库存储:不适合大文件
### 5. 前端:静态页面
**决策**:使用纯 HTML/CSS/JavaScript 静态页面
**原因**
- 简单直接,无需构建工具
- 易于部署和维护
- 满足当前功能需求
**考虑的替代方案**
- React/Vue 框架:功能强大但增加复杂度
- 服务端渲染:当前不需要 SEO
## 架构设计
### 后端架构
```
app/
├── __init__.py # Flask 应用初始化
├── config.py # 配置管理
├── routes/
│ └── video_routes.py # 视频相关路由
├── services/
│ ├── video_service.py # 视频处理服务
│ ├── dashscope_service.py # DashScope API 封装
│ └── analysis_service.py # 分析业务逻辑
├── models/
│ ├── video.py # 视频模型
│ ├── analysis.py # 分析结果模型
│ └── comparison.py # 对比结果模型
└── utils/
├── file_utils.py # 文件处理工具
└── validators.py # 验证工具
```
### API 端点设计
```
POST /api/videos/upload # 上传视频
GET /api/videos # 获取视频列表
GET /api/videos/{video_id} # 获取视频详情
POST /api/videos/{video_id}/analyze # 解析视频内容
POST /api/videos/{video_id}/summarize # 生成视频总结
GET /api/videos/{video_id}/summary # 获取视频总结
POST /api/videos/compare # 对比多个视频
GET /api/videos/compare/{comparison_id} # 获取对比结果
```
### 数据模型设计
**Video 文档**
```python
{
"_id": ObjectId,
"filename": str,
"file_path": str,
"upload_time": datetime,
"file_size": int,
"status": str, # "uploaded", "analyzing", "analyzed", "failed"
"mime_type": str
}
```
**AnalysisResult 文档**
```python
{
"_id": ObjectId,
"video_id": ObjectId,
"analysis_type": str, # "content", "summary"
"content": str,
"fps": int,
"created_at": datetime
}
```
**Comparison 文档**
```python
{
"_id": ObjectId,
"video_ids": [ObjectId],
"comparison_result": str,
"created_at": datetime
}
```
## 风险 / 权衡
### 风险
1. **API 调用失败** → 实现重试机制和错误处理
2. **大文件上传超时** → 设置合理的文件大小限制和超时时间
3. **视频解析耗时** → 异步处理,返回任务 ID客户端轮询状态
4. **存储空间增长** → 定期清理或归档旧文件
### 权衡
- **同步 vs 异步处理**:当前采用同步处理,简单但可能阻塞。后续可改为异步任务队列
- **本地存储 vs 对象存储**:当前使用本地存储,简单但扩展性有限
## 迁移计划
- 无需迁移(新功能)
## 开放问题
- [ ] 是否需要实现视频文件清理策略(自动删除旧文件)?
- [ ] 是否需要支持批量视频上传?
- [ ] 视频解析的 fps 参数是否需要可配置?
- [ ] 是否需要实现解析结果缓存机制?