P1: 多预览视频独立标题 — 每个预览视频分别设置标题 #1282

Closed
opened 2026-08-07 20:46:42 +08:00 by xiaoxia · 0 comments
Owner

需求概述

支持用户一次性生成多个预览视频,每个视频有独立的标题、配音、封面。单视频模式下体验与现有完全一致。

核心设计

生成数量提前到第1步

  • 在模板选择步骤增加"生成视频数量"设置(默认1,可选1~10)
  • 选1个:后续流程与现有完全一致,无多余操作
  • 选多个:后续各步骤支持多份配置,按索引一一对应

素材共用,AI随机剪辑

  • 多个视频共用同一批素材
  • AI剪辑时随机选择使用哪些素材、随机切片时间段
  • 保证每个预览版本的剪辑内容不同,不是简单重复

配音灵活配置

  • 默认所有视频共用同一个配音(操作与现有一致)
  • 支持切换为"每个视频独立配音",分别选择不同的音

标题与预览合并为一步

  • 不再分设标题步骤和预览生成步骤
  • 进入该步骤后自动生成预览,无需用户额外点击
  • 每个预览视频独立可播放
  • 每个预览下方有独立标题输入框
  • 标题样式(字体、颜色、位置、大小)全局统一,改一次全部生效
  • 标题文字各自独立,可逐个修改
  • 标题通过前端CSS浮层(TitleOverlay)实时叠加在预览视频上,改标题即时可见,不需要重新渲染视频

每个预览独立封面

  • N个预览对应N张封面
  • 每张封面带各自的标题文字
  • 可逐个重新生成或上传自定义封面

确认生成

  • 列出所有预览视频(缩略图+标题+配音+封面)
  • 用户勾选要正式生成哪些(可全选或只选满意的)
  • 后端批量渲染最终视频,每个视频烧录自己的标题、配音、封面

步骤流程

新6步流程:

  1. 模板选择(含生成数量设置)
  2. 素材选择(共用)
  3. 配音选择(可共用或独立)
  4. 标题+预览(自动生成,每个预览独立标题,CSS浮层实时叠加)
  5. 封面(每个预览独立封面,带各自标题)
  6. 确认生成(勾选后批量渲染)

单视频模式下与现有7步流程体验一致(只是标题和预览合并为一步,步骤数减少)。

技术实现要点

已确认的现有架构

  • 预览视频不烧录标题:后端渲染管线(UnifiedRenderService)只做素材拼接+BGM+配音+转场
  • 标题通过前端 TitleOverlay 组件以CSS浮层形式叠加在<video>
  • 封面候选帧在预览渲染时通过FFmpeg drawtext叠加标题(thumbnail_generator.py)
  • 前端多预览已实现(useStep5Preview),支持1~10个并发生成和网格展示

需要改动

前端

  1. Step1 模板选择

    • 新增"生成视频数量"选择器(默认1,可选1~10)
    • 单视频模式隐藏多视频相关UI
  2. 步骤调整

    • 现有7步合并为6步:标题(4)+预览(5)合并为新Step4
    • 封面改为Step5,确认改为Step6
    • constants.ts 更新步骤定义
  3. 数据结构

    • 新增 previewCount: number(全局状态,第1步确定)
    • 新增 previewTitles: string[](每个预览的标题文字,长度=previewCount)
    • 新增 previewCovers: CoverConfig[](每个预览的封面,长度=previewCount)
    • titleSettings 保持单个对象(字体、颜色、位置、大小等样式全局共享)
    • 配音:voiceLibraryId: string 共用模式,或 voiceLibraryIds: string[] 独立模式
    • 预览生成后用默认标题初始化 previewTitles 数组
  4. Step3 配音

    • 共用模式:选一个配音,所有视频使用(现有逻辑)
    • 独立模式:展示N个配音选择器,每个预览独立选择
  5. 新Step4 标题+预览

    • 进入步骤自动触发预览生成(不需要点按钮)
    • N个预览视频网格展示,每个独立可播放
    • 每个预览下方有标题输入框,默认填入模板标题
    • 点选某个预览,右侧/下方播放器放大播放该预览
    • 播放器上用 TitleOverlay 叠加对应 previewTitles[i] 的标题
    • 标题样式面板全局统一
    • 改标题文字即时更新浮层显示
    • 重新生成预览时保留已设标题(数量变化时截断/追加)
  6. Step5 封面

    • N个预览对应N个封面卡片
    • 每个封面带对应预览的标题文字
    • 支持逐个重新生成或上传
  7. Step6 确认生成

    • 列出所有预览(缩略图+标题+配音+封面)
    • 每个预览有勾选框
    • 确认后批量提交,每个视频携带自己的 title、voice、cover

后端

  1. 预览生成接口 (/generation/preview)

    • 接收 preview_count 参数,批量创建N个预览任务
    • AI剪辑逻辑:随机选择素材、随机切片时间段,保证每个版本不同
    • 预览渲染时封面候选帧不叠加标题(标题还未确定),只抽原始帧
    • 支持每个预览任务独立的 voice_library_id(独立配音模式)
  2. 封面生成接口 (/generation/generate-cover)

    • 接收 task_id(指定哪个预览视频)和 title_text(该预览的标题)
    • 从指定预览视频抽帧,用传入的 title_text 叠加标题
    • 不再依赖 plan.config 中的标题,标题由前端显式传入
  3. 正式生成接口

    • 支持批量提交,每个子任务携带独立的 title_config、voice_library_id、cover_url
    • 最终渲染时烧录标题(通过ASS字幕或drawtext)
  4. AI剪辑随机性

    • 片段选择策略:从素材池中随机选取素材,随机决定切片起止时间
    • 保证N个预览版本内容有明显差异

验收标准

  • 第1步可以选择生成1~10个视频
  • 选1个时,整个流程与现有体验一致
  • 选多个时,素材共用,AI随机剪辑出不同版本
  • 配音可共用也可每个视频独立选择
  • 进入标题+预览步骤自动生成预览,无需额外点击
  • 每个预览视频独立可播放
  • 每个预览有独立标题输入框,默认填入模板标题
  • 标题样式全局统一,标题文字各自独立
  • 改标题即时在预览上显示(CSS浮层,不重新渲染视频)
  • 每个预览生成独立封面,封面上有各自的标题
  • 确认页面可勾选要生成的视频,批量正式生成
  • 正式视频每个烧录自己的标题、配音、封面

相关代码

前端

  • apps/web/src/pages/generate/constants.ts — 步骤定义
  • apps/web/src/pages/generate/GeneratePage.tsx — 主页面状态管理
  • apps/web/src/pages/generate/components/GenerateStepContent.tsx — 步骤内容路由
  • apps/web/src/pages/generate/components/Step1TemplateSelect.tsx — 模板选择(需加数量选择器)
  • apps/web/src/pages/generate/components/Step5VoiceSelect.tsx — 配音选择(需支持独立模式)
  • apps/web/src/pages/generate/components/Step4TitleSettings.tsx — 标题设置(需重构)
  • apps/web/src/pages/generate/components/Step5GeneratePreview.tsx — 预览展示(需与标题合并)
  • apps/web/src/pages/generate/components/Step6CoverSettings.tsx — 封面(需支持多封面)
  • apps/web/src/pages/generate/components/Step7ConfirmGenerate.tsx — 确认生成(需支持批量)
  • apps/web/src/pages/generate/components/PreviewVideoPanel.tsx — 预览播放器+TitleOverlay
  • apps/web/src/pages/generate/hooks/useStep5Preview.ts — 多预览Hook
  • apps/web/src/pages/generate/hooks/useGenerateFormState/ — 表单状态
  • apps/web/src/api/generation/types.ts — API类型定义

后端

  • apps/api/app/api/routes/generation_cover.py — 封面生成接口
  • apps/worker/worker_app/tasks/generation.py — 视频生成任务
  • apps/worker/video_processing/render_adapter.py — 渲染适配器
  • apps/worker/video_processing/thumbnail_generator.py — 封面帧抽取+标题叠加

关联

  • 依赖 #1281(多预览视频功能,已完成)
  • 本工单取代原 #1282 的旧方案(步骤调换方案),新方案不改步骤顺序,而是将标题和预览合并

后端实现方案更新(2026-08-29 代码核实 + PR2 方案)

现状代码核实(已逐行确认)

  • 多预览目前由前端 N 次并发调用实现(#1281 已完成):前端 useStep5Preview 循环调 POST /generation/preview。后端 schema 虽已有 preview_count 字段(1~10,schemas/generation_task.py:176),但预览接口实际只创建 1 个任务preview_count 仅写日志,未做批量循环。
  • 核心问题(本工单"AI 剪辑随机性"要求的后端缺口)
    • 预览 N 次调用 + 正式批量 count>1generation_tasks.py 批量循环 for _ in range(count))中,每个任务共用同一个 source_edit_plan_id(前端不传时兜底逻辑还会把同 template 下最新 plan 关联给所有任务);
    • worker _render_from_edit_plan 按 plan_id 渲染同一套 clips → N 个视频的素材片段区间完全一模一样,不满足"每个预览版本剪辑内容不同"。
  • PR1 基础已落地(PR #1543,2026-08-29 合并,merge commit f655508f,staging 已部署验收):
    • 素材片段区间持久化去重:used_segments 持久化到素材 metadata 的 used_time_ranges 字段(apps/api/app/services/asset_segment_tracker.py);
    • from-assets 读取历史区间让新片段自动避开已用区间;单素材区间用尽自动轮回重置;
    • _calc_random_start_timepackages/domain/plan_generator_utils.py)新增 on_exhausted 回调,100 次避不开 → 重置该素材历史 → 重试一次;
    • MediaKit 异步改片段 start_time 后区间记录同事务同步。
  • 多标题/独立配音/独立封面前提:当前批量循环中所有 task 共用同一份 title_config / voice_library_id / cover_url / video_titlegeneration_tasks.py CreateGenerationTaskCommand 循环内取 request 单值)。要实现"每个视频独立标题/配音/封面",后端需支持按任务索引传数组。

PR2:批量生成各自独立 EditPlan(本工单后端主任务)

目标:N 个预览 / N 条正式生成各自有独立 plan,片段区间互不相同;与工单"素材共用、AI 随机剪辑、保证每个版本不同"完全对齐。

改动点

  1. 预览接口支持真正批量apps/api/app/api/routes/generation_preview.py

    • preview_count 在后端循环创建 N 个任务(替代/兼容前端 N 次调用;前端可逐步改为一次请求);
    • 同批次共享 batch_id(正式批量已有此机制,预览对齐)。
  2. 每个任务克隆独立 EditPlan

    • 批量循环中,为每个 task 从源 plan 克隆一份新 EditPlan:复制 plan config + clips(asset_id / clip duration / 顺序结构不变)到新 plan_id(用 EditPlanService.create_plan + replace_all_clips_transactional,同事务);
    • 克隆时对每个 clip 重新调用 _calc_random_start_time,传入 PR1 的持久化区间 asset_segment_tracker.get_used_segments(db, asset_ids) + make_reset_callback 轮回回调 → 每个版本起点独立,且跨版本、跨任务区间互不重叠;
    • 每个 task 的 source_edit_plan_id 指向各自的克隆 plan;
    • 克隆 plan 与任务创建在同一 DB 事务,失败整体回滚,不留孤儿 plan。
  3. 正式批量生成对齐apps/api/app/api/routes/generation_tasks.py,count>1 循环 ~421 行)

    • 同样为每个 task 克隆独立 plan 并重算片段起点;
    • 单条场景(preview_count=1 / count=1)行为完全不变:继续复用原 plan,不克隆。
  4. 独立标题/配音/封面透传(支撑工单"每个视频独立标题/配音/封面")

    • 批量请求支持按索引传数组:title_configs: list[dict]voice_library_ids: list[str]cover_urls: list[str](长度=数量,缺省回落共用单值,向后兼容);
    • 每个克隆 plan 的 config / 每个 task 的字段独立写入,worker _sync_task_config_to_plan 已按 task 维度同步,确认不串。
  5. 前端配合(工单前端部分已列):预览批量可改为一次请求传 preview_count;确认页勾选后批量提交携带各自 title/voice/cover。

后端验收标准

  • preview_count=3 创建 3 个任务、3 个不同 plan_id,同 batch_id
  • 3 个视频的片段区间互不重叠(查各 plan clips 的 start_time + 素材 metadata.used_time_ranges 交叉验证)
  • 正式批量 count>1 同样各自独立 plan
  • 单条(preview_count=1 / count=1)行为不变,复用原 plan,无多余克隆
  • 独立 title_config / voice_library_id / cover_url 按任务正确透传、渲染烧录各自内容
  • 克隆/任务创建事务失败无孤儿 plan、无脏任务
  • 接口性能无明显退化(克隆为 DB 内操作,O(片段数))
  • 现有测试全绿,补充批量克隆单测;CI 全绿后合并、staging 部署验收

依赖:PR #1543(片段区间持久化去重 + 轮回)已合并,本方案直接复用其 tracker 与回调机制。

## 需求概述 支持用户一次性生成多个预览视频,每个视频有独立的标题、配音、封面。单视频模式下体验与现有完全一致。 ## 核心设计 ### 生成数量提前到第1步 - 在模板选择步骤增加"生成视频数量"设置(默认1,可选1~10) - 选1个:后续流程与现有完全一致,无多余操作 - 选多个:后续各步骤支持多份配置,按索引一一对应 ### 素材共用,AI随机剪辑 - 多个视频共用同一批素材 - AI剪辑时随机选择使用哪些素材、随机切片时间段 - 保证每个预览版本的剪辑内容不同,不是简单重复 ### 配音灵活配置 - 默认所有视频共用同一个配音(操作与现有一致) - 支持切换为"每个视频独立配音",分别选择不同的音 ### 标题与预览合并为一步 - 不再分设标题步骤和预览生成步骤 - 进入该步骤后自动生成预览,无需用户额外点击 - 每个预览视频独立可播放 - 每个预览下方有独立标题输入框 - 标题样式(字体、颜色、位置、大小)全局统一,改一次全部生效 - 标题文字各自独立,可逐个修改 - 标题通过前端CSS浮层(TitleOverlay)实时叠加在预览视频上,改标题即时可见,不需要重新渲染视频 ### 每个预览独立封面 - N个预览对应N张封面 - 每张封面带各自的标题文字 - 可逐个重新生成或上传自定义封面 ### 确认生成 - 列出所有预览视频(缩略图+标题+配音+封面) - 用户勾选要正式生成哪些(可全选或只选满意的) - 后端批量渲染最终视频,每个视频烧录自己的标题、配音、封面 ## 步骤流程 **新6步流程:** 1. 模板选择(含生成数量设置) 2. 素材选择(共用) 3. 配音选择(可共用或独立) 4. 标题+预览(自动生成,每个预览独立标题,CSS浮层实时叠加) 5. 封面(每个预览独立封面,带各自标题) 6. 确认生成(勾选后批量渲染) 单视频模式下与现有7步流程体验一致(只是标题和预览合并为一步,步骤数减少)。 ## 技术实现要点 ### 已确认的现有架构 - 预览视频**不烧录标题**:后端渲染管线(UnifiedRenderService)只做素材拼接+BGM+配音+转场 - 标题通过前端 TitleOverlay 组件以CSS浮层形式叠加在`<video>`上 - 封面候选帧在预览渲染时通过FFmpeg drawtext叠加标题(thumbnail_generator.py) - 前端多预览已实现(useStep5Preview),支持1~10个并发生成和网格展示 ### 需要改动 #### 前端 1. **Step1 模板选择** - 新增"生成视频数量"选择器(默认1,可选1~10) - 单视频模式隐藏多视频相关UI 2. **步骤调整** - 现有7步合并为6步:标题(4)+预览(5)合并为新Step4 - 封面改为Step5,确认改为Step6 - constants.ts 更新步骤定义 3. **数据结构** - 新增 `previewCount: number`(全局状态,第1步确定) - 新增 `previewTitles: string[]`(每个预览的标题文字,长度=previewCount) - 新增 `previewCovers: CoverConfig[]`(每个预览的封面,长度=previewCount) - `titleSettings` 保持单个对象(字体、颜色、位置、大小等样式全局共享) - 配音:`voiceLibraryId: string` 共用模式,或 `voiceLibraryIds: string[]` 独立模式 - 预览生成后用默认标题初始化 previewTitles 数组 4. **Step3 配音** - 共用模式:选一个配音,所有视频使用(现有逻辑) - 独立模式:展示N个配音选择器,每个预览独立选择 5. **新Step4 标题+预览** - 进入步骤自动触发预览生成(不需要点按钮) - N个预览视频网格展示,每个独立可播放 - 每个预览下方有标题输入框,默认填入模板标题 - 点选某个预览,右侧/下方播放器放大播放该预览 - 播放器上用 TitleOverlay 叠加对应 previewTitles[i] 的标题 - 标题样式面板全局统一 - 改标题文字即时更新浮层显示 - 重新生成预览时保留已设标题(数量变化时截断/追加) 6. **Step5 封面** - N个预览对应N个封面卡片 - 每个封面带对应预览的标题文字 - 支持逐个重新生成或上传 7. **Step6 确认生成** - 列出所有预览(缩略图+标题+配音+封面) - 每个预览有勾选框 - 确认后批量提交,每个视频携带自己的 title、voice、cover #### 后端 1. **预览生成接口** (`/generation/preview`) - 接收 `preview_count` 参数,批量创建N个预览任务 - AI剪辑逻辑:随机选择素材、随机切片时间段,保证每个版本不同 - 预览渲染时封面候选帧**不叠加标题**(标题还未确定),只抽原始帧 - 支持每个预览任务独立的 `voice_library_id`(独立配音模式) 2. **封面生成接口** (`/generation/generate-cover`) - 接收 `task_id`(指定哪个预览视频)和 `title_text`(该预览的标题) - 从指定预览视频抽帧,用传入的 title_text 叠加标题 - 不再依赖 plan.config 中的标题,标题由前端显式传入 3. **正式生成接口** - 支持批量提交,每个子任务携带独立的 title_config、voice_library_id、cover_url - 最终渲染时烧录标题(通过ASS字幕或drawtext) 4. **AI剪辑随机性** - 片段选择策略:从素材池中随机选取素材,随机决定切片起止时间 - 保证N个预览版本内容有明显差异 ## 验收标准 - [ ] 第1步可以选择生成1~10个视频 - [ ] 选1个时,整个流程与现有体验一致 - [ ] 选多个时,素材共用,AI随机剪辑出不同版本 - [ ] 配音可共用也可每个视频独立选择 - [ ] 进入标题+预览步骤自动生成预览,无需额外点击 - [ ] 每个预览视频独立可播放 - [ ] 每个预览有独立标题输入框,默认填入模板标题 - [ ] 标题样式全局统一,标题文字各自独立 - [ ] 改标题即时在预览上显示(CSS浮层,不重新渲染视频) - [ ] 每个预览生成独立封面,封面上有各自的标题 - [ ] 确认页面可勾选要生成的视频,批量正式生成 - [ ] 正式视频每个烧录自己的标题、配音、封面 ## 相关代码 ### 前端 - `apps/web/src/pages/generate/constants.ts` — 步骤定义 - `apps/web/src/pages/generate/GeneratePage.tsx` — 主页面状态管理 - `apps/web/src/pages/generate/components/GenerateStepContent.tsx` — 步骤内容路由 - `apps/web/src/pages/generate/components/Step1TemplateSelect.tsx` — 模板选择(需加数量选择器) - `apps/web/src/pages/generate/components/Step5VoiceSelect.tsx` — 配音选择(需支持独立模式) - `apps/web/src/pages/generate/components/Step4TitleSettings.tsx` — 标题设置(需重构) - `apps/web/src/pages/generate/components/Step5GeneratePreview.tsx` — 预览展示(需与标题合并) - `apps/web/src/pages/generate/components/Step6CoverSettings.tsx` — 封面(需支持多封面) - `apps/web/src/pages/generate/components/Step7ConfirmGenerate.tsx` — 确认生成(需支持批量) - `apps/web/src/pages/generate/components/PreviewVideoPanel.tsx` — 预览播放器+TitleOverlay - `apps/web/src/pages/generate/hooks/useStep5Preview.ts` — 多预览Hook - `apps/web/src/pages/generate/hooks/useGenerateFormState/` — 表单状态 - `apps/web/src/api/generation/types.ts` — API类型定义 ### 后端 - `apps/api/app/api/routes/generation_cover.py` — 封面生成接口 - `apps/worker/worker_app/tasks/generation.py` — 视频生成任务 - `apps/worker/video_processing/render_adapter.py` — 渲染适配器 - `apps/worker/video_processing/thumbnail_generator.py` — 封面帧抽取+标题叠加 ## 关联 - 依赖 #1281(多预览视频功能,已完成) - 本工单取代原 #1282 的旧方案(步骤调换方案),新方案不改步骤顺序,而是将标题和预览合并 --- ## 后端实现方案更新(2026-08-29 代码核实 + PR2 方案) ### 现状代码核实(已逐行确认) - **多预览目前由前端 N 次并发调用实现**(#1281 已完成):前端 `useStep5Preview` 循环调 `POST /generation/preview`。后端 schema 虽已有 `preview_count` 字段(1~10,`schemas/generation_task.py:176`),但**预览接口实际只创建 1 个任务**,`preview_count` 仅写日志,未做批量循环。 - **核心问题(本工单"AI 剪辑随机性"要求的后端缺口)**: - 预览 N 次调用 + 正式批量 `count>1`(`generation_tasks.py` 批量循环 `for _ in range(count)`)中,每个任务共用同一个 `source_edit_plan_id`(前端不传时兜底逻辑还会把同 template 下最新 plan 关联给所有任务); - worker `_render_from_edit_plan` 按 plan_id 渲染同一套 clips → **N 个视频的素材片段区间完全一模一样**,不满足"每个预览版本剪辑内容不同"。 - **PR1 基础已落地**(PR #1543,2026-08-29 合并,merge commit `f655508f`,staging 已部署验收): - 素材片段区间持久化去重:`used_segments` 持久化到素材 metadata 的 `used_time_ranges` 字段(`apps/api/app/services/asset_segment_tracker.py`); - from-assets 读取历史区间让新片段自动避开已用区间;单素材区间用尽自动轮回重置; - `_calc_random_start_time`(`packages/domain/plan_generator_utils.py`)新增 `on_exhausted` 回调,100 次避不开 → 重置该素材历史 → 重试一次; - MediaKit 异步改片段 start_time 后区间记录同事务同步。 - **多标题/独立配音/独立封面前提**:当前批量循环中所有 task 共用同一份 `title_config` / `voice_library_id` / `cover_url` / `video_title`(`generation_tasks.py` CreateGenerationTaskCommand 循环内取 request 单值)。要实现"每个视频独立标题/配音/封面",后端需支持按任务索引传数组。 ### PR2:批量生成各自独立 EditPlan(本工单后端主任务) **目标**:N 个预览 / N 条正式生成各自有独立 plan,片段区间互不相同;与工单"素材共用、AI 随机剪辑、保证每个版本不同"完全对齐。 **改动点**: 1. **预览接口支持真正批量**(`apps/api/app/api/routes/generation_preview.py`) - 按 `preview_count` 在后端循环创建 N 个任务(替代/兼容前端 N 次调用;前端可逐步改为一次请求); - 同批次共享 `batch_id`(正式批量已有此机制,预览对齐)。 2. **每个任务克隆独立 EditPlan** - 批量循环中,为每个 task 从源 plan 克隆一份新 EditPlan:复制 plan config + clips(asset_id / clip duration / 顺序结构不变)到新 plan_id(用 `EditPlanService.create_plan` + `replace_all_clips_transactional`,同事务); - 克隆时对每个 clip 重新调用 `_calc_random_start_time`,传入 PR1 的持久化区间 `asset_segment_tracker.get_used_segments(db, asset_ids)` + `make_reset_callback` 轮回回调 → 每个版本起点独立,且跨版本、跨任务区间互不重叠; - 每个 task 的 `source_edit_plan_id` 指向各自的克隆 plan; - 克隆 plan 与任务创建在同一 DB 事务,失败整体回滚,不留孤儿 plan。 3. **正式批量生成对齐**(`apps/api/app/api/routes/generation_tasks.py`,count>1 循环 ~421 行) - 同样为每个 task 克隆独立 plan 并重算片段起点; - 单条场景(preview_count=1 / count=1)行为完全不变:继续复用原 plan,不克隆。 4. **独立标题/配音/封面透传**(支撑工单"每个视频独立标题/配音/封面") - 批量请求支持按索引传数组:`title_configs: list[dict]`、`voice_library_ids: list[str]`、`cover_urls: list[str]`(长度=数量,缺省回落共用单值,向后兼容); - 每个克隆 plan 的 config / 每个 task 的字段独立写入,worker `_sync_task_config_to_plan` 已按 task 维度同步,确认不串。 5. **前端配合**(工单前端部分已列):预览批量可改为一次请求传 `preview_count`;确认页勾选后批量提交携带各自 title/voice/cover。 **后端验收标准**: - [ ] `preview_count=3` 创建 3 个任务、3 个不同 plan_id,同 batch_id - [ ] 3 个视频的片段区间互不重叠(查各 plan clips 的 start_time + 素材 metadata.used_time_ranges 交叉验证) - [ ] 正式批量 `count>1` 同样各自独立 plan - [ ] 单条(preview_count=1 / count=1)行为不变,复用原 plan,无多余克隆 - [ ] 独立 title_config / voice_library_id / cover_url 按任务正确透传、渲染烧录各自内容 - [ ] 克隆/任务创建事务失败无孤儿 plan、无脏任务 - [ ] 接口性能无明显退化(克隆为 DB 内操作,O(片段数)) - [ ] 现有测试全绿,补充批量克隆单测;CI 全绿后合并、staging 部署验收 **依赖**:PR #1543(片段区间持久化去重 + 轮回)已合并,本方案直接复用其 tracker 与回调机制。
xiaoxia added the devops label 2026-08-07 20:46:42 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: xiaoxia/xiaoxia-saas#1282