243 lines
4.2 KiB
Markdown
243 lines
4.2 KiB
Markdown
# 专项 D:生成链生产化深化 - 规划文档
|
||
|
||
**专项负责人**:小虾 🦐
|
||
**创建时间**:2026-06-19 10:50 GMT+8
|
||
**状态**:🔄 进行中
|
||
|
||
---
|
||
|
||
## 一、专项目标
|
||
|
||
**把当前的 mock 生成逻辑改造为真实的媒体处理管线。**
|
||
|
||
从"返回假数据"提升到"真正能生成视频"。
|
||
|
||
---
|
||
|
||
## 二、当前状态
|
||
|
||
### 当前实现(Mock)
|
||
|
||
**位置**:`apps/worker/tasks.py::generate_video`
|
||
|
||
```python
|
||
def generate_video(task_id: str):
|
||
# Mock: 直接创建一个假的生成结果
|
||
session.add(GeneratedVideoModel(...))
|
||
session.commit()
|
||
```
|
||
|
||
**问题**:
|
||
- 没有真实的视频处理
|
||
- 返回的是假的文件路径
|
||
- 无法真正下载视频
|
||
|
||
---
|
||
|
||
## 三、目标实现
|
||
|
||
### 真实生成流程
|
||
|
||
```
|
||
1. 获取生成任务
|
||
↓
|
||
2. 加载素材库中的素材
|
||
↓
|
||
3. 分析素材元数据(时长/分辨率/编码)
|
||
↓
|
||
4. 根据策略选择素材
|
||
↓
|
||
5. 使用 FFmpeg 进行视频合成
|
||
- 拼接视频片段
|
||
- 添加转场效果
|
||
- 混音(如有配音)
|
||
↓
|
||
6. 生成缩略图
|
||
↓
|
||
7. 上传到 MinIO
|
||
↓
|
||
8. 创建 GeneratedVideo 记录
|
||
↓
|
||
9. 更新任务状态
|
||
```
|
||
|
||
---
|
||
|
||
## 四、技术方案
|
||
|
||
### 方案选择:使用 FFmpeg
|
||
|
||
**理由**:
|
||
- 功能强大,支持几乎所有视频格式
|
||
- Python 有成熟的 wrapper(ffmpeg-python)
|
||
- 性能好,命令行工具稳定
|
||
|
||
**替代方案**:
|
||
- MoviePy(太慢,不适合生产)
|
||
- OpenCV(功能有限)
|
||
- 云服务(成本高)
|
||
|
||
---
|
||
|
||
## 五、实现计划
|
||
|
||
### Phase 1:基础框架(本次)
|
||
|
||
- [ ] 安装 ffmpeg-python 依赖
|
||
- [ ] 创建 `VideoProcessor` 类
|
||
- [ ] 实现简单的视频拼接
|
||
- [ ] 生成缩略图
|
||
- [ ] 上传到 MinIO
|
||
- [ ] 更新 worker 逻辑
|
||
|
||
### Phase 2:高级功能(后续)
|
||
|
||
- [ ] 转场效果
|
||
- [ ] 字幕叠加
|
||
- [ ] 配音混音
|
||
- [ ] 滤镜效果
|
||
- [ ] 质量优化
|
||
|
||
---
|
||
|
||
## 六、架构设计
|
||
|
||
### 新增模块
|
||
|
||
```
|
||
apps/worker/
|
||
└── video_processing/
|
||
├── __init__.py
|
||
├── processor.py # VideoProcessor 核心类
|
||
├── ffmpeg_wrapper.py # FFmpeg 命令封装
|
||
├── thumbnail.py # 缩略图生成
|
||
└── strategies.py # 生成策略
|
||
```
|
||
|
||
### VideoProcessor 接口
|
||
|
||
```python
|
||
class VideoProcessor:
|
||
def generate_video(
|
||
self,
|
||
assets: List[Asset],
|
||
strategy: Strategy,
|
||
output_path: str
|
||
) -> VideoResult:
|
||
"""生成视频"""
|
||
pass
|
||
|
||
def generate_thumbnail(
|
||
self,
|
||
video_path: str,
|
||
timestamp: float = 1.0
|
||
) -> str:
|
||
"""生成缩略图"""
|
||
pass
|
||
```
|
||
|
||
---
|
||
|
||
## 七、MVP 范围(本次实现)
|
||
|
||
### ✅ 必须实现
|
||
|
||
1. **简单拼接**:
|
||
- 把多个视频素材按顺序拼接
|
||
- 输出单个 MP4 文件
|
||
|
||
2. **缩略图**:
|
||
- 从视频第 1 秒截图
|
||
|
||
3. **存储**:
|
||
- 上传到 MinIO
|
||
- 返回正确的文件路径
|
||
|
||
4. **元数据**:
|
||
- 正确记录时长/分辨率/大小
|
||
|
||
### ❌ 暂不实现
|
||
|
||
- 转场效果
|
||
- 字幕叠加
|
||
- 配音混音
|
||
- 复杂策略
|
||
|
||
---
|
||
|
||
## 八、验收标准
|
||
|
||
### 成功标准
|
||
|
||
- ✅ 能从素材库选择素材
|
||
- ✅ 能生成真实的 MP4 文件
|
||
- ✅ 文件能正常播放
|
||
- ✅ 缩略图正常显示
|
||
- ✅ 能从前端下载
|
||
|
||
### 失败标准
|
||
|
||
- ❌ FFmpeg 报错无法生成
|
||
- ❌ 生成的文件无法播放
|
||
- ❌ 文件路径错误
|
||
|
||
---
|
||
|
||
## 九、依赖和环境
|
||
|
||
### 系统依赖
|
||
|
||
- FFmpeg 4.0+ (需要预装)
|
||
- Python 3.12+
|
||
|
||
### Python 依赖
|
||
|
||
```
|
||
ffmpeg-python==0.2.0
|
||
pillow>=10.0.0
|
||
```
|
||
|
||
### 检查方式
|
||
|
||
```bash
|
||
ffmpeg -version
|
||
```
|
||
|
||
---
|
||
|
||
## 十、风险评估
|
||
|
||
### 已知风险
|
||
|
||
1. **FFmpeg 未安装**
|
||
- 影响:无法生成视频
|
||
- 应对:提供安装文档
|
||
|
||
2. **素材格式不兼容**
|
||
- 影响:FFmpeg 报错
|
||
- 应对:添加格式检查和转码
|
||
|
||
3. **生成时间长**
|
||
- 影响:任务超时
|
||
- 应对:设置合理的超时时间
|
||
|
||
4. **存储空间**
|
||
- 影响:磁盘满
|
||
- 应对:设置配额限制
|
||
|
||
---
|
||
|
||
## 十一、执行顺序
|
||
|
||
1. **环境检查**:确认 FFmpeg 可用
|
||
2. **创建模块**:video_processing 目录结构
|
||
3. **实现 Processor**:VideoProcessor 核心类
|
||
4. **集成 Worker**:更新 generate_video 任务
|
||
5. **测试验证**:生成真实视频
|
||
6. **文档更新**:添加部署文档
|
||
|
||
---
|
||
|
||
**状态**:准备开始执行
|
||
**预计时间**:1-2 小时
|