# Video-Flow AI 剪辑集成技术文档

## 📋 项目概述

本文档详细记录了将 OpenCut 项目的 AI 智能剪辑功能集成到 Video-Flow 工作流系统中的完整技术方案。该集成实现了从剧本生成的视频片段到最终成片的自动化 AI 剪辑流程。

### 🎯 集成目标

- **自动化剪辑**: 在 Video-Flow 工作流中实现一键 AI 剪辑功能
- **无缝集成**: 复用 OpenCut 的核心 AI 剪辑逻辑，无需重复开发
- **流程优化**: 简化从视频片段到最终成片的处理流程
- **用户体验**: 提供直观的进度反馈和错误处理机制

## 🏗️ 架构设计

### 整体架构图

```mermaid
graph TB
    subgraph "Video-Flow 前端层"
        A[work-flow.tsx] --> B[ai-editing-button.tsx]
        B --> C[ai-editing-adapter.ts]
    end

    subgraph "API 适配层"
        C --> D[/api/export/ai-clips]
        D --> E[export-adapter.ts]
    end

    subgraph "OpenCut 核心逻辑"
        E --> F[FFmpeg处理]
        F --> G[视频导出]
        G --> H[云存储上传]
    end

    subgraph "Video-Flow 后端"
        H --> I[任务状态更新]
        I --> J[最终成片展示]
    end
```

### 核心组件关系

```mermaid
classDiagram
    class WorkFlowPage {
        +handleAIEditingComplete()
        +handleAIEditingError()
        +showGotoCutButton: boolean
    }

    class AIEditingButton {
        +onClick()
        +showProgress()
        +handleComplete()
    }

    class AIEditingAdapter {
        +executeAIEditing()
        +convertVideoFlowData()
        +callExportAPI()
    }

    class ExportAdapter {
        +POST()
        +processFFmpeg()
        +uploadToCloud()
    }

    WorkFlowPage --> AIEditingButton
    AIEditingButton --> AIEditingAdapter
    AIEditingAdapter --> ExportAdapter
```

## 📁 文件结构

```
video-flow/
├── components/pages/work-flow/
│   ├── ai-editing-adapter.ts      # AI剪辑逻辑适配器
│   ├── ai-editing-button.tsx      # AI剪辑按钮组件
│   └── work-flow.tsx              # 主工作流页面(已修改)
├── app/api/export/
│   ├── ai-clips/route.ts          # AI剪辑导出API路由
│   └── download/[exportId]/route.ts # 视频下载API路由
├── api/
│   └── export-adapter.ts          # 导出API适配器
└── docs/
    └── AI-EDITING-INTEGRATION.md  # 本技术文档
```

## 🔧 核心组件详解

### 1. AI 剪辑适配器 (`ai-editing-adapter.ts`)

**职责**: 将 Video-Flow 的数据结构转换为 OpenCut 兼容格式，并管理整个 AI 剪辑流程。

**核心功能**:

```typescript
class AIEditingAdapter {
  // 执行完整的AI剪辑流程
  async executeAIEditing(): Promise<string>;

  // 数据格式转换
  private convertVideoFlowToAIClips(): AIClipData[];

  // 调用导出API
  private callExportAPI(): Promise<string>;

  // 进度回调管理
  private onProgress?: (progress: number, message: string) => void;
}
```

**数据转换逻辑**:

```typescript
// Video-Flow格式 -> OpenCut AI剪辑格式
{
  videos: VideoFlowVideoData[]
}
↓
{
  clips: AIClipData[],
  totalDuration: number,
  options: ExportOptions
}
```

### 2. AI 剪辑按钮组件 (`ai-editing-button.tsx`)

**职责**: 提供用户交互界面，显示剪辑进度和状态反馈。

**功能特性**:

- ✨ 美观的玻璃态设计
- 📊 实时进度显示
- 🔄 状态管理（待机/处理中/完成/错误）
- 🎭 流畅的动画效果
- 📱 响应式设计

**使用示例**:

```tsx
<AIEditingIconButton
  projectId={episodeId}
  taskObject={taskObject}
  onComplete={handleAIEditingComplete}
  onError={handleAIEditingError}
/>
```

### 3. 导出 API 适配器 (`export-adapter.ts`)

**职责**: 复用 OpenCut 的 FFmpeg 处理逻辑，提供流式进度反馈。

**核心流程**:

1. **数据验证**: 检查输入的视频片段数据
2. **FFmpeg 处理**: 执行视频剪辑和合成
3. **进度推送**: 通过 Server-Sent Events 推送实时进度
4. **云存储上传**: 将处理完成的视频上传到云存储
5. **URL 返回**: 返回最终的视频访问链接

## 🚀 完整工作流程

### 1. 触发条件

```typescript
// 当Video-Flow工作流进入video阶段且有视频片段时
if (taskObject.currentStage === "video" && taskObject.videos.data.length > 0) {
  // 显示AI剪辑按钮
  showAIEditingButton = true;
}
```

### 2. AI 剪辑执行流程

```mermaid
sequenceDiagram
    participant U as 用户
    participant B as AI剪辑按钮
    participant A as AI适配器
    participant API as 导出API
    participant F as FFmpeg
    participant C as 云存储
    participant W as WorkFlow页面

    U->>B: 点击AI剪辑按钮
    B->>A: executeAIEditing()
    A->>A: convertVideoFlowToAIClips()
    A->>API: POST /api/export/ai-clips
    API->>F: 启动FFmpeg处理

    loop 进度更新
        F->>API: 处理进度
        API->>A: Server-Sent Events
        A->>B: onProgress回调
        B->>U: 更新进度UI
    end

    F->>C: 上传处理完成的视频
    C->>API: 返回视频URL
    API->>A: 完成通知
    A->>B: onComplete回调
    B->>W: handleAIEditingComplete()
    W->>W: 更新任务状态到final_video
```

### 3. 数据流转换

**输入数据结构**:

```typescript
// Video-Flow视频数据
interface VideoFlowVideoData {
  id: string;
  url: string;
  scene_id: string;
  duration?: number;
  // ... 其他字段
}
```

**转换后数据结构**:

```typescript
// OpenCut AI剪辑格式
interface AIClipData {
  sequence_clip_id: string;
  source_clip_id: string;
  video_url: string;
  source_in_timecode: string;
  source_out_timecode: string;
  sequence_start_timecode: string;
  clip_duration_in_sequence: string;
  corresponding_script_scene_id?: string;
}
```

## 🔌 API 接口文档

### POST /api/export/ai-clips

**描述**: AI 剪辑导出接口，复用 OpenCut 的核心导出逻辑

**请求体**:

```typescript
{
  clips: AIClipData[];
  subtitles?: string;
  totalDuration: number;
  options: {
    quality: 'low' | 'standard' | 'high';
    format: 'mp4' | 'webm' | 'mov';
    fps?: number;
  };
}
```

**响应格式**: Server-Sent Events 流式响应

```typescript
// 进度更新
data: {"type": "progress", "progress": 45, "message": "处理视频片段 2/5"}

// 完成通知
data: {"type": "completed", "downloadUrl": "https://example.com/video.mp4"}
```

### GET /api/export/download/[exportId]

**描述**: 导出视频下载接口

**参数**:

- `exportId`: 导出任务 ID

**响应**:

- 成功: 返回视频文件流
- 失败: 返回错误 JSON

## 🎨 UI/UX 设计

### 按钮状态设计

```typescript
enum AIEditingState {
  IDLE = "idle", // 待机状态 - 显示剪刀图标
  PROCESSING = "processing", // 处理中 - 显示进度环
  COMPLETED = "completed", // 完成 - 显示对勾图标
  ERROR = "error", // 错误 - 显示错误图标
}
```

### 进度显示设计

```typescript
// 进度阶段划分
const PROGRESS_STAGES = {
  DATA_CONVERSION: { start: 0, end: 20, message: "数据转换中..." },
  VIDEO_PROCESSING: { start: 20, end: 80, message: "AI剪辑处理中..." },
  UPLOAD_COMPLETE: { start: 80, end: 100, message: "上传完成！" },
};
```

### 视觉效果

- **玻璃态设计**: 使用`backdrop-blur-lg`实现磨砂玻璃效果
- **动画效果**: 使用 Framer Motion 实现流畅的状态转换
- **进度指示**: 圆形进度条配合百分比显示
- **状态反馈**: 不同状态使用不同的颜色和图标

## 🔧 配置与部署

### 环境依赖

```json
{
  "dependencies": {
    "framer-motion": "^10.x.x",
    "lucide-react": "^0.x.x",
    "antd": "^5.x.x"
  }
}
```

### 环境变量

```bash
# 云存储配置（继承自OpenCut项目）
QINIU_ACCESS_KEY=your_access_key
QINIU_SECRET_KEY=your_secret_key
QINIU_BUCKET=your_bucket_name
QINIU_DOMAIN=your_domain

# FFmpeg配置
FFMPEG_PATH=/usr/local/bin/ffmpeg
```

### 部署检查清单

- [ ] 确保 FFmpeg 已正确安装
- [ ] 验证云存储配置
- [ ] 检查 API 路由是否正确注册
- [ ] 测试流式响应功能
- [ ] 验证错误处理机制

## 🧪 测试策略

### 单元测试

```typescript
describe("AIEditingAdapter", () => {
  test("应该正确转换Video-Flow数据格式", () => {
    const adapter = new AIEditingAdapter(mockTaskObject);
    const result = adapter.convertVideoFlowToAIClips();
    expect(result).toHaveLength(mockTaskObject.videos.data.length);
  });

  test("应该正确处理进度回调", () => {
    const onProgress = jest.fn();
    const adapter = new AIEditingAdapter(mockTaskObject, { onProgress });
    adapter.executeAIEditing();
    expect(onProgress).toHaveBeenCalled();
  });
});
```

### 集成测试

```typescript
describe("AI剪辑集成测试", () => {
  test("完整的AI剪辑流程", async () => {
    // 1. 准备测试数据
    const mockTaskObject = createMockTaskObject();

    // 2. 执行AI剪辑
    const result = await executeAIEditing(mockTaskObject);

    // 3. 验证结果
    expect(result).toContain("http");
    expect(result).toMatch(/\.mp4$/);
  });
});
```

### 性能测试

- **响应时间**: API 响应时间应在 5 秒内
- **内存使用**: 处理过程中内存使用应保持在合理范围
- **并发处理**: 支持多个 AI 剪辑任务并发执行

## 🐛 故障排除

### 常见问题

1. **FFmpeg 未找到**

   ```bash
   错误: FFmpeg executable not found
   解决: 确保FFmpeg已安装并在PATH中
   ```

2. **视频格式不支持**

   ```bash
   错误: Unsupported video format
   解决: 检查输入视频格式，确保为支持的格式
   ```

3. **云存储上传失败**
   ```bash
   错误: Upload failed
   解决: 检查云存储配置和网络连接
   ```

### 日志分析

```typescript
// 启用详细日志
console.log("🎬 AI剪辑开始:", { projectId, clipCount });
console.log("📊 数据转换完成:", convertedData);
console.log("🚀 API调用中:", apiEndpoint);
console.log("✅ 处理完成:", finalVideoUrl);
```

## 🔮 未来优化方向

### 性能优化

1. **并行处理**: 支持多个视频片段并行处理
2. **缓存机制**: 实现处理结果缓存，避免重复计算
3. **压缩优化**: 优化视频压缩算法，减小文件大小

### 功能增强

1. **自定义剪辑规则**: 允许用户自定义 AI 剪辑参数
2. **批量处理**: 支持批量项目的 AI 剪辑处理
3. **预览功能**: 在正式导出前提供剪辑预览

### 用户体验

1. **进度细化**: 提供更详细的处理进度信息
2. **错误恢复**: 实现处理失败后的自动重试机制
3. **通知系统**: 添加处理完成的通知功能

## 📚 参考资料

- [OpenCut 项目文档](../apps/web/README.md)
- [Video-Flow 项目文档](./README.md)
- [FFmpeg 官方文档](https://ffmpeg.org/documentation.html)
- [Next.js API Routes 文档](https://nextjs.org/docs/api-routes/introduction)
- [Server-Sent Events 规范](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)

## 📞 技术支持

如有技术问题，请联系开发团队或在项目仓库中创建 Issue。

---

**文档版本**: v1.0.0  
**最后更新**: 2025-01-08  
**维护者**: 资深全栈开发工程师  
**审核者**: 项目技术负责人
