Files
meijiaka-zy/docs/video-generation-flow.md
T

23 KiB
Raw Blame History

视频生成交互流程设计

一、正常流程(批量生成)

┌─────────────────────────────────────────────────────────────────┐
│ Step 0: 检查前置条件                                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  点击【生成视频】按钮                                             │
│       │                                                          │
│       ▼                                                          │
│  ┌─────────────────┐                                             │
│  │ 检查本地状态     │                                             │
│  │ 如果正在生成中   │───► 提示"已有任务进行中,请等待完成"         │
│  └─────────────────┘         或者"是否取消当前任务?"             │
│       │                                                          │
│       ▼ 无进行中任务                                             │
│  ┌─────────────────┐                                             │
│  │ 检查是否选形象   │                                             │
│  │ 未选择          │───► 弹出形象选择弹窗                         │
│  └─────────────────┘                                             │
│       │                                                          │
│       ▼ 已选择                                                   │
│  继续下一步                                                       │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ Step 1: 确认弹窗                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌─────────────────────────────────────────┐                    │
│  │           开始生成视频                   │                    │
│  ├─────────────────────────────────────────┤                    │
│  │                                          │                    │
│  │  将生成 8 个分镜视频                      │                    │
│  │  预计耗时:约 15-20 分钟                  │                    │
│  │                                          │                    │
│  │  ⚠️ 生成过程中请勿关闭应用               │                    │
│  │     您可以最小化窗口,但不要关闭         │                    │
│  │                                          │                    │
│  │  ┌────────────┐  ┌──────────────────┐   │                    │
│  │  │  取消      │  │  开始生成        │   │                    │
│  │  └────────────┘  └──────────────────┘   │                    │
│  │                                          │                    │
│  └─────────────────────────────────────────┘                    │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ Step 2: 进入生成状态(界面锁定)                                   │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  【生成】按钮变为【生成中...】且 disabled                          │
│                                                                  │
│  顶部显示全局状态栏:                                              │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │ 🎬 视频生成中  ━━━━━━━━⏳━━━━  预计还需 12 分钟    [?]     ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
│  显示模态弹窗(不可关闭):                                        │
│  ┌─────────────────────────────────────────┐                    │
│  │           视频生成                       │                    │
│  ├─────────────────────────────────────────┤                    │
│  │                                          │                    │
│  │         ┌─────────────┐                 │                    │
│  │         │  状态标签    │                 │                    │
│  │         │  任务已开启  │                 │                    │
│  │         └─────────────┘                 │                    │
│  │                                          │                    │
│  │     正在为空镜生成参考图片...            │                    │
│  │                                          │                    │
│  │     预计还需 12 分钟                     │                    │
│  │                                          │                    │
│  │     [最小化到后台]                       │                    │
│  │                                          │                    │
│  └─────────────────────────────────────────┘                    │
│                                                                  │
│  界面锁定状态:                                                    │
│  - 禁用:生成按钮、新建项目、添加/删除分镜                        │
│  - 可浏览:但不能修改任何内容                                     │
│  - 可退出应用:但会提示"任务将后台继续,确定退出?"                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ Step 3: 状态流转                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  状态标签流转:                                                   │
│                                                                  │
│  分镜(omni-video):                                             │
│  任务已开启 ──► 排队生成中 ──► 任务已完成                         │
│                                                                  │
│  空镜(文生图+图生视频):                                        │
│  任务已开启 ──► 生成参考图片... ──► 排队生成中 ──► 任务已完成      │
│                                                                  │
│  详细描述文字实时更新(SSE 推送):                                │
│  - "正在初始化任务..."                                            │
│  - "正在为空镜生成参考图片..."                                    │
│  - "图片生成完成,开始生成视频..."                                │
│  - "正在生成视频,请稍候..."                                      │
│  - "已完成 3/8 个分镜"                                            │
│  - "整理生成结果..."                                              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ Step 4: 完成                                                     │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  模态弹窗更新:                                                   │
│  ┌─────────────────────────────────────────┐                    │
│  │           视频生成                       │                    │
│  ├─────────────────────────────────────────┤                    │
│  │                                          │                    │
│  │         ┌─────────────┐                 │                    │
│  │         │  任务已完成  │                 │                    │
│  │         └─────────────┘                 │                    │
│  │                                          │                    │
│  │     成功生成 8 个视频                    │                    │
│  │                                          │                    │
│  │  ┌──────────────────────────────────┐   │                    │
│  │  │           确定                    │   │                    │
│  │  └──────────────────────────────────┘   │                    │
│  │                                          │                    │
│  └─────────────────────────────────────────┘                    │
│                                                                  │
│  用户点击【确定】:                                                │
│  1. 关闭弹窗                                                       │
│  2. 解锁界面                                                       │
│  3. 自动滚动到第一个有视频的分镜                                   │
│  4. 播放第一个视频                                                │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

二、单个重新生成流程

┌─────────────────────────────────────────────────────────────────┐
│ 差异点                                                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  入口:分镜卡片上的【重新生成】按钮                                │
│                                                                  │
│  确认弹窗简化:                                                    │
│  ┌─────────────────────────────────────────┐                    │
│  │           重新生成视频                   │                    │
│  ├─────────────────────────────────────────┤                    │
│  │  将重新生成分镜 3 的视频                 │                    │
│  │  预计耗时:约 3-5 分钟                   │                    │
│  │                                          │                    │
│  │  ⚠️ 生成过程中请勿关闭应用               │                    │
│  │                                          │                    │
│  │  [取消]  [确定]                          │                    │
│  └─────────────────────────────────────────┘                    │
│                                                                  │
│  完成后:自动选中该分镜并播放                                      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘

三、异常流程

3.1 用户尝试关闭应用

用户点击关闭窗口(或 Cmd+Q / Alt+F4
    │
    ▼
┌─────────────────────────────────────────┐
│           ⚠️ 确认关闭                    │
├─────────────────────────────────────────┤
│                                          │
│  视频生成任务仍在进行中                  │
│                                          │
│  如果选择关闭:                          │
│  - 任务将在后台继续运行                  │
│  - 生成完成后会推送系统通知              │
│  - 下次打开应用可查看结果                │
│                                          │
│  [取消]  [最小化到托盘]  [关闭应用]      │
│                                          │
└─────────────────────────────────────────┘

3.2 应用崩溃/强制退出后恢复

用户重新打开应用
    │
    ▼
┌─────────────────────────────────────────┐
│           📋 恢复未完成任务              │
├─────────────────────────────────────────┤
│                                          │
│  检测到上次有未完成的视频生成任务        │
│                                          │
│  项目:厨房改造方案                      │
│  进度:已完成 5/8 个分镜                 │
│  状态:仍在后台处理中                    │
│                                          │
│  [查看进度]  [我知道了]                  │
│                                          │
└─────────────────────────────────────────┘

点击【查看进度】:
- 跳转到视频生成页面
- 自动恢复进度弹窗显示
- 继续监听 SSE/轮询

3.3 生成失败

┌─────────────────────────────────────────┐
│           ❌ 生成失败                    │
├─────────────────────────────────────────┤
│                                          │
│  视频生成过程中发生错误                  │
│                                          │
│  错误信息:Kling API 超时                │
│                                          │
│  已生成的视频已保存                      │
│  失败的分镜:分镜3、分镜7                │
│                                          │
│  [返回查看]  [重试失败项]                │
│                                          │
└─────────────────────────────────────────┘

点击【重试失败项】:
- 只重新生成失败的那几个分镜
- 复用现有参数

3.4 网络断开

SSE 连接断开
    │
    ▼
状态栏显示:"网络异常,正在重连...1/3"
    │
    ▼
自动重连 SSE(最多 3 次)
    │
    ├─► 重连成功:继续接收进度
    │
    └─► 重连失败:切换到轮询模式
            │
            ▼
    每 5 秒轮询一次状态
            │
            ▼
    网络恢复后:自动切回 SSE

四、本地状态管理

// localStorage: meijiaka_generation_state
interface GenerationState {
  // 任务标识
  jobId: string;
  projectId: string;
  
  // 任务状态
  status: 'pending' | 'generating' | 'completed' | 'failed';
  
  // 任务信息(用于恢复显示)
  shots: Array<{
    id: string;
    type: 'segment' | 'empty_shot';
  }>;
  totalShots: number;
  
  // 时间戳
  startedAt: number;
  lastUpdatedAt: number;
  
  // 结果(完成后填写)
  results?: Array<{
    shotId: string;
    status: 'completed' | 'failed';
    videoPath?: string;
    errorMessage?: string;
  }>;
  
  // 错误信息
  errorMessage?: string;
}

五、状态流转图

                    ┌─────────────┐
                    │    IDLE     │
                    └──────┬──────┘
                           │ 点击生成
                           ▼
                    ┌─────────────┐
   ┌───────────────►│  CONFIRM    │◄───────────────┐
   │               │   确认弹窗   │                │
   │               └──────┬──────┘                │
   │ 取消                 │ 确认                   │
   │                      ▼                       │
   │               ┌─────────────┐                │
   │               │  GENERATING │────────────────┤
   │               │   生成中    │   应用崩溃/关闭 │
   │               └──────┬──────┘                │
   │                      │                       │
   │         ┌────────────┼────────────┐         │
   │         │            │            │         │
   │         ▼            ▼            ▼         │
   │   ┌─────────┐  ┌─────────┐  ┌─────────┐    │
   │   │SUCCESS  │  │ FAILED  │  │ TIMEOUT │    │
   │   └────┬────┘  └────┬────┘  └────┬────┘    │
   │        │            │            │         │
   │        ▼            └────────────┘         │
   │   ┌─────────┐               │              │
   └───┤ RESULT  │◄──────────────┘              │
       │ 结果弹窗 │                               │
       └────┬────┘                               │
            │                                    │
            ▼                                    │
       ┌─────────┐                               │
       │   IDLE  │───────────────────────────────┘
       └─────────┘         下次启动检测恢复

六、关键决策点

决策 选择 理由
生成中能否关闭应用 可以,但提示后台继续 用户有急事时需要关闭
生成中能否切换项目 不能 避免状态混乱
生成中能否修改脚本 不能 避免参数不一致
失败后能否重试 可以,只重试失败的 减少重复等待
是否需要系统通知 需要(第二阶段) 用户最小化后能感知完成