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