<title>分镜组节点视频生成</title>

# 分镜组节点视频生成功能

## 功能概述

分镜组节点新增了视频生成功能，可以将整个分镜组的所有分镜合并生成为一个完整的视频。该功能与分镜节点的视频生成功能类似，但具有以下特点：

1. **拼接所有分镜的视频提示词**：汇总整个分镜组中所有子分镜节点的视频提示词，每个镜头标明时间范围
2. **使用分镜首帧作为图生视频输入图**：首帧模式下，多个分镜时将所有分镜的首帧图片合并为宫格图作为输入图；仅单个分镜时，取第一个分镜节点的首帧图片
3. **一次性生成视频**：根据抽卡次数生成对应数量的视频（不是为每个分镜单独生成）

## 功能位置

在分镜组节点节点体的"视频生成"区域（位于"分镜预览与生成"区域，即"宫格生图"所在区域，的右侧），包含以下UI元素：

- **视频模型选择器**：支持 视频生成模型 A、B、C、D、E、F 六种模型
- **视频时长选择器**：根据选择的模型动态显示可用时长选项
- **"合并生成视频"按钮**：带有抽卡次数下拉菜单（X1-X4）；另有"逐个生成视频"按钮（为每个分镜独立生成视频）
- **算力消耗显示**：实时显示单个视频算力和总算力消耗

## 视频提示词拼接格式

分镜组视频生成时，会将所有子分镜的视频提示词按照以下格式拼接：

```Plaintext
镜头1：0~4S，[镜头1的视频提示词内容]；镜头2：4~7S，[镜头2的视频提示词内容]；镜头3：7~12S，[镜头3的视频提示词内容]
```

### 时间计算规则

- 镜头一时长：0 ~ 镜头一.duration
- 镜头二时长：镜头一.duration ~ (镜头一.duration + 镜头二.duration)
- 以此类推，累计每个镜头的时长

### 示例

假设有3个分镜节点，时长分别为5秒、5秒、5秒，视频提示词拼接结果为：

```Plaintext
镜头1：0~5S，夜晚，城市街道，主角走在雨中；镜头2：5~10S，主角进入咖啡厅，坐下点咖啡；镜头3：10~15S，主角看向窗外，表情沉思
```

## 使用流程

### 1. 准备工作

在使用分镜组视频生成功能之前，需要确保：

1. 已创建分镜组节点
2. 已生成分镜节点（通过"生成分镜"按钮）
3. 至少一个分镜节点已生成首帧图片（通过"生成分镜图"按钮）

### 2. 配置视频参数

1. **选择视频模型**：从下拉菜单中选择合适的视频模型

   - 视频生成模型 A：支持5秒、10秒
   - 视频生成模型 B：支持10秒、15秒
   - 视频生成模型 C：支持5秒、8秒、10秒
   - 视频生成模型 D：支持5秒、10秒
   - 视频生成模型 E：支持5秒、8秒
   - 视频生成模型 F：仅支持8秒
2. **选择视频时长**：根据模型选择可用的时长选项
3. **选择抽卡次数**：点击"合并生成视频"按钮右侧的下拉箭头，选择X1-X4
4. **查看算力消耗**：系统会实时显示算力消耗（单个视频算力 × 抽卡次数）

### 3. 生成视频

点击"合并生成视频"按钮，系统会：

1. 检查是否有分镜节点
2. 检查分镜节点是否有首帧图片（首帧模式下；多个分镜时先调用宫格合并接口，将所有首帧合并为宫格图）
3. 拼接所有分镜的视频提示词
4. 调用图生视频API
5. 创建对应数量的视频节点
6. 轮询视频生成状态
7. 更新视频节点的URL

## 算力计算

分镜组视频生成的算力消耗计算公式：

```Plaintext
总算力 = 单个视频算力 × 抽卡次数
```

不同模型和时长的算力消耗由后端任务配置决定，前端通过任务算力配置接口（内部实现）获取。

## 错误处理

### 无分镜节点

如果分镜组节点下没有分镜节点，点击"合并生成视频"按钮时会提示：

```Plaintext
请先生成分镜节点
```

### 无首帧图片

如果分镜节点没有首帧图片（首帧模式下），点击"合并生成视频"按钮时会提示：

```Plaintext
分镜节点没有首帧图片，请先生成分镜图
```

### 视频生成失败

如果视频生成失败，系统会显示具体的错误信息，并将按钮状态恢复为"生成视频"。

## 数据保存与恢复

分镜组节点的视频相关数据会自动保存到工作流中，包括：

- `videoModel`：视频模型
- `videoDuration`：视频时长
- `videoDrawCount`：抽卡次数

重新加载工作流时，这些数据会自动恢复。

## 技术实现

### 关键函数（内部实现）

- 分镜组视频生成主函数
- 视频生成算力计算函数
- 算力显示更新函数
- 根据所选模型更新时长选项的函数

### 数据结构

分镜组节点的 `data` 对象新增字段：

```JavaScript
{
  videoModel: 'video_model_a',  // 视频模型
  videoDuration: 5,             // 视频时长（秒）
  videoDrawCount: 1,            // 抽卡次数
  // ... 其他字段
}
```

### API调用

视频生成使用与分镜节点相同的API接口：

```Plaintext
POST /api/ai-app-run-image
```

参数：

- `image_urls`：图生视频输入图片URL（首帧模式下，多个分镜为宫格合并图URL，单个分镜为第一个分镜节点的首帧图片URL；参考模式下为逗号拼接的参考图URL）
- `prompt`：拼接后的视频提示词
- `duration_seconds`：视频时长
- `count`：抽卡次数
- `ratio`：视频比例（默认9:16）
- `task_id`：视频模型对应的任务ID（前端通过任务配置将所选视频模型转换为任务ID）
- `user_id`：用户ID
- `auth_token`：鉴权令牌

## 与分镜节点视频生成的区别

| 特性 | 分镜节点 | 分镜组节点 |
|-|-|-|
| 视频提示词 | 单个分镜的视频提示词 | 所有分镜的视频提示词拼接（标明时间范围） |
| 首帧图片 | 当前分镜节点的首帧 | 首帧模式下，多分镜为宫格合并图（所有分镜首帧），单分镜为第一个分镜节点的首帧 |
| 生成数量 | 根据抽卡次数生成多个视频 | 根据抽卡次数生成多个视频 |
| 视频时长 | 用户选择的时长 | 用户选择的时长（不是所有分镜时长之和） |
| 适用场景 | 单个镜头的视频生成 | 整个分镜组的视频生成 |

## 注意事项

1. **分镜组生成的是单一视频**：不是为每个分镜单独生成视频，而是将所有分镜合并为一个视频
2. **图生视频输入依赖分镜首帧**：首帧模式下需要确保分镜节点有首帧图片（多个分镜时所有分镜首帧会合并为宫格图）
3. **视频时长由用户选择**：不是所有分镜时长的总和，而是用户在下拉菜单中选择的时长
4. **算力计算**：单个视频算力 × 抽卡次数
5. **视频提示词格式**：每个镜头标明时间范围，用分号分隔

## 测试用例

相关测试用例位于自动化测试用例目录下的 `shot_group_video.json`，包括：

- 基础流程测试
- 视频提示词拼接验证
- 首帧选择验证
- 不同视频模型测试
- 时长选项动态更新
- 算力计算验证
- 错误处理测试
- 工作流保存与恢复测试
