Files
sionrui/openspec/professional-simple-mix-spec.md
2025-12-15 23:33:02 +08:00

136 lines
4.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.
# 混剪功能规格(简化版)
## 核心需求
- **输入**:用户选择素材 + 设定每个素材截取时长3-15s
- **输出**1-3个不同内容的混剪视频
- **总时长**15s-60s
- **差异化**:同顺序 + 同时长 + **随机截取起点**
## 多视频差异化算法
### 核心原理
**随机起点 + 容错机制**
- 每个视频使用**随机截取起点**,确保内容完全不同
- 支持**不同长度的素材**ICE自动容错处理
- 容错如果起点超出素材长度ICE自动从0开始截取
**随机种子**:使用 `素材ID×1000000 + 视频序号×10000 + URL哈希%1000` 确保可重现性
### 算法实现
**随机起点生成**
```java
// 1. 先获取视频实际时长
int actualDuration = getVideoDuration(videoUrl);
// 2. 生成随机种子
long randomSeed = (material.getFileId() * 1000000L) +
(videoIndex * 10000L) +
(material.getFileUrl().hashCode() % 1000);
Random random = new Random(randomSeed);
// 3. 根据实际时长计算起始范围
int maxStartOffset = Math.max(0, actualDuration - duration);
int startOffset = random.nextInt(maxStartOffset + 1);
int endOffset = startOffset + duration;
```
**获取视频时长方案**
1. **数据库字段**上传时预存duration字段推荐
2. **FFprobe工具**:命令行获取视频元数据
3. **ICE元数据API**调用ICE查询接口
4. **默认60秒**:保守值,兼容性最好
**容错机制**
- 根据实际时长计算最大起始偏移,避免超出素材长度
- 如果获取时长失败使用默认值60秒
- ICE自动处理边界情况
### ICE Timeline构建
每个素材片段包含参数:
- `MediaURL`:素材地址
- `In`随机截取起始点0到实际时长-duration之间
- `Out`:截取结束点 = `In + duration`
- `TimelineIn/TimelineOut`:时间轴位置(顺序拼接)
ICE自动处理超出素材长度的情况无需额外判断。
## API设计
### 请求格式
```http
POST /api/mix/create
{
"title": "",
"materials": [
{ "fileId": 123, "fileUrl": "https://xxx/v1.mp4", "duration": 5 },
{ "fileId": 456, "fileUrl": "https://xxx/v2.mp4", "duration": 8 },
{ "fileId": 789, "fileUrl": "https://xxx/v3.mp4", "duration": 5 }
],
"produceCount": 3
}
```
### 后端处理流程
1. 校验请求参数总时长15-60s
2. 循环生成produceCount个视频
- videoIndex = 0, 1, 2...
- 获取每个素材的实际时长(数据库/FFprobe/ICE API
- 生成随机起点基于素材ID×1000000 + videoIndex×10000 + URL哈希
- 根据实际时长计算起始范围,避免超出素材长度
- 构建Timeline传递随机In/Out参数给ICE
- 提交ICE任务
3. 保存任务并返回任务ID
## 校验规则
| 规则 | 前端 | 后端 |
|------|------|------|
| 总时长 15-60s | ✅ | ✅ |
| 单素材 3-15s | ✅ | ✅ |
| 至少选1个素材 | ✅ | ✅ |
| 生成数量 1-3 | ✅ | ✅ |
## 实现清单
### 已完成
- [x] 前端时长选择和实时计算
- [x] 后端VOMaterialItem实现
- [x] 后端DOmaterialsJson字段
- [x] 数据库迁移脚本
- [x] 后端Controller/api/mix/create
- [x] 后端Service多视频生成逻辑
- [x] ICE Timeline构建随机起点+实际时长+容错)
- [x] 批量任务提交和状态跟踪
### 测试验证
- [ ] 编译验证
- [ ] 端到端功能测试
- [ ] 多视频差异化验证
---
## 代码修改清单
### 核心修改
1. **BatchProduceAlignment.java**
- 新增方法:`produceSingleVideoWithOffset(materials, videoIndex, userId)`
- 新增方法:`getVideoDuration(videoUrl)` - 获取视频实际时长
- 核心逻辑:先获取实际时长,再生成随机起点
- 容错机制:根据实际时长计算范围,避免超出长度
2. **MixTaskServiceImpl.java**
- 循环生成produceCount个视频
- 每次传入不同的videoIndex确保随机起点不同
3. **数据库结构(可选改进)**
- 新增字段:`duration INTEGER COMMENT '视频时长(秒)'`
- 上传时预处理使用FFprobe获取时长并存储
*版本v3.0 - 简化版ICE自动容错*