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

4.1 KiB
Raw Blame History

混剪功能规格(简化版)

核心需求

  • 输入:用户选择素材 + 设定每个素材截取时长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;

获取视频时长方案

  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设计

请求格式

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

实现清单

已完成

  • 前端时长选择和实时计算
  • 后端VOMaterialItem实现
  • 后端DOmaterialsJson字段
  • 数据库迁移脚本
  • 后端Controller/api/mix/create
  • 后端Service多视频生成逻辑
  • ICE Timeline构建随机起点+实际时长+容错)
  • 批量任务提交和状态跟踪

测试验证

  • 编译验证
  • 端到端功能测试
  • 多视频差异化验证

代码修改清单

核心修改

  1. BatchProduceAlignment.java

    • 新增方法:produceSingleVideoWithOffset(materials, videoIndex, userId)
    • 新增方法:getVideoDuration(videoUrl) - 获取视频实际时长
    • 核心逻辑:先获取实际时长,再生成随机起点
    • 容错机制:根据实际时长计算范围,避免超出长度
  2. MixTaskServiceImpl.java

    • 循环生成produceCount个视频
    • 每次传入不同的videoIndex确保随机起点不同
  3. 数据库结构(可选改进)

    • 新增字段:duration INTEGER COMMENT '视频时长(秒)'
    • 上传时预处理使用FFprobe获取时长并存储

版本v3.0 - 简化版ICE自动容错