# 图生视频API配置说明

## 概述

图生视频API允许用户上传图片并生成视频内容。系统支持首帧图片（必填）和尾帧图片（可选），结合用户描述文字生成动态视频。

## 功能特性

- ✅ 图片上传（支持JPG、PNG、WEBP格式）
- ✅ 多种视频比例（16:9、4:3、1:1、3:4、9:16）
- ✅ 可调节视频时长（5s、10s、15s、30s）
- ✅ 高清模式（1080P，额外消耗积分）
- ✅ 实时任务状态监控
- ✅ 进度条显示
- ✅ 任务取消功能
- ✅ 积分消耗计算

## API接口

### 1. 创建图生视频任务

**POST** `/api/image-to-video/create`

**请求参数：**
- `firstFrame` (File, 必填): 首帧图片
- `lastFrame` (File, 可选): 尾帧图片
- `prompt` (String, 必填): 描述文字
- `aspectRatio` (String, 可选): 视频比例，默认"16:9"
- `duration` (Integer, 可选): 视频时长（秒），默认5
- `hdMode` (Boolean, 可选): 是否高清模式，默认false

**响应示例：**
```json
{
  "success": true,
  "message": "任务创建成功",
  "data": {
    "id": 1,
    "taskId": "img2vid_abc123def456",
    "username": "test_user",
    "firstFrameUrl": "/uploads/img2vid_abc123def456/first_frame_1234567890.jpg",
    "prompt": "测试图生视频",
    "aspectRatio": "16:9",
    "duration": 5,
    "hdMode": false,
    "status": "PENDING",
    "progress": 0,
    "costPoints": 20,
    "createdAt": "2025-01-24T10:30:00"
  }
}
```

### 2. 获取用户任务列表

**GET** `/api/image-to-video/tasks`

**查询参数：**
- `page` (Integer, 可选): 页码，默认0
- `size` (Integer, 可选): 每页数量，默认10

**响应示例：**
```json
{
  "success": true,
  "data": [
    {
      "taskId": "img2vid_abc123def456",
      "status": "COMPLETED",
      "progress": 100,
      "resultUrl": "/outputs/img2vid_abc123def456/video_1234567890.mp4",
      "createdAt": "2025-01-24T10:30:00"
    }
  ],
  "total": 1,
  "page": 0,
  "size": 10
}
```

### 3. 获取任务详情

**GET** `/api/image-to-video/tasks/{taskId}`

**响应示例：**
```json
{
  "success": true,
  "data": {
    "taskId": "img2vid_abc123def456",
    "username": "test_user",
    "firstFrameUrl": "/uploads/img2vid_abc123def456/first_frame_1234567890.jpg",
    "prompt": "测试图生视频",
    "aspectRatio": "16:9",
    "duration": 5,
    "hdMode": false,
    "status": "COMPLETED",
    "progress": 100,
    "resultUrl": "/outputs/img2vid_abc123def456/video_1234567890.mp4",
    "costPoints": 20,
    "createdAt": "2025-01-24T10:30:00",
    "completedAt": "2025-01-24T10:35:00"
  }
}
```

### 4. 获取任务状态

**GET** `/api/image-to-video/tasks/{taskId}/status`

**响应示例：**
```json
{
  "success": true,
  "data": {
    "id": "img2vid_abc123def456",
    "status": "PROCESSING",
    "progress": 45,
    "resultUrl": null,
    "errorMessage": null
  }
}
```

### 5. 取消任务

**POST** `/api/image-to-video/tasks/{taskId}/cancel`

**响应示例：**
```json
{
  "success": true,
  "message": "任务已取消"
}
```

## 任务状态说明

| 状态 | 描述 | 说明 |
|------|------|------|
| PENDING | 等待中 | 任务已创建，等待处理 |
| PROCESSING | 处理中 | 正在生成视频 |
| COMPLETED | 已完成 | 视频生成成功 |
| FAILED | 失败 | 生成过程中出现错误 |
| CANCELLED | 已取消 | 用户主动取消任务 |

## 积分消耗计算

- **基础消耗**: 10积分
- **时长消耗**: 时长(秒) × 2积分
- **高清模式**: 额外20积分

**示例：**
- 5秒普通视频：10 + 5×2 = 20积分
- 10秒高清视频：10 + 10×2 + 20 = 50积分

## 前端集成示例

### 1. 创建任务

```javascript
import { imageToVideoApi } from '@/api/imageToVideo'

const createTask = async () => {
  const params = {
    firstFrame: firstFrameFile.value,
    lastFrame: lastFrameFile.value, // 可选
    prompt: inputText.value.trim(),
    aspectRatio: aspectRatio.value,
    duration: parseInt(duration.value),
    hdMode: hdMode.value
  }
  
  try {
    const response = await imageToVideoApi.createTask(params)
    if (response.data.success) {
      console.log('任务创建成功:', response.data.data)
      // 开始轮询任务状态
      startPollingTask(response.data.data.taskId)
    }
  } catch (error) {
    console.error('创建任务失败:', error)
  }
}
```

### 2. 轮询任务状态

```javascript
const startPollingTask = (taskId) => {
  const stopPolling = imageToVideoApi.pollTaskStatus(
    taskId,
    // 进度回调
    (progressData) => {
      console.log('任务进度:', progressData.progress + '%')
      updateProgressBar(progressData.progress)
    },
    // 完成回调
    (taskData) => {
      console.log('任务完成:', taskData.resultUrl)
      showResult(taskData.resultUrl)
    },
    // 错误回调
    (error) => {
      console.error('任务失败:', error.message)
      showError(error.message)
    }
  )
  
  // 可以调用 stopPolling() 来停止轮询
}
```

## 文件上传限制

- **文件大小**: 最大10MB
- **支持格式**: JPG、PNG、WEBP
- **存储路径**: `/uploads/{taskId}/`
- **输出路径**: `/outputs/{taskId}/`

## 数据库表结构

```sql
CREATE TABLE image_to_video_tasks (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    task_id VARCHAR(50) NOT NULL UNIQUE,
    username VARCHAR(100) NOT NULL,
    first_frame_url VARCHAR(500) NOT NULL,
    last_frame_url VARCHAR(500),
    prompt TEXT,
    aspect_ratio VARCHAR(10) NOT NULL DEFAULT '16:9',
    duration INT NOT NULL DEFAULT 5,
    hd_mode BOOLEAN NOT NULL DEFAULT FALSE,
    status VARCHAR(20) NOT NULL DEFAULT 'PENDING',
    progress INT DEFAULT 0,
    result_url VARCHAR(500),
    error_message TEXT,
    cost_points INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    completed_at TIMESTAMP NULL
);
```

## 部署注意事项

1. **文件存储**: 确保 `uploads` 和 `outputs` 目录有写入权限
2. **异步处理**: 已启用 `@EnableAsync` 支持异步任务处理
3. **安全配置**: 图生视频API需要用户认证
4. **CORS配置**: 已配置支持前端跨域访问
5. **文件大小**: 已设置最大上传文件大小为10MB

## 测试方法

1. 启动后端服务
2. 运行测试脚本：`./test-image-to-video-api.sh`
3. 或使用前端页面进行测试

## 故障排除

### 常见问题

1. **文件上传失败**
   - 检查文件大小是否超过10MB
   - 确认文件格式是否支持
   - 检查服务器存储权限

2. **任务状态不更新**
   - 检查异步处理是否正常
   - 查看服务器日志
   - 确认数据库连接正常

3. **前端轮询失败**
   - 检查网络连接
   - 确认API接口地址正确
   - 查看浏览器控制台错误

### 日志查看

```bash
# 查看应用日志
tail -f logs/application.log

# 查看特定任务日志
grep "img2vid_abc123def456" logs/application.log
```








