video-flow-b/docs/AI-EDITING-INTEGRATION.md
2025-10-27 15:48:42 +08:00

469 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# video-flow-b AI 剪辑集成技术文档
## 📋 项目概述
本文档详细记录了将 OpenCut 项目的 AI 智能剪辑功能集成到 video-flow-b 工作流系统中的完整技术方案。该集成实现了从剧本生成的视频片段到最终成片的自动化 AI 剪辑流程。
### 🎯 集成目标
- **自动化剪辑**: 在 video-flow-b 工作流中实现一键 AI 剪辑功能
- **无缝集成**: 复用 OpenCut 的核心 AI 剪辑逻辑,无需重复开发
- **流程优化**: 简化从视频片段到最终成片的处理流程
- **用户体验**: 提供直观的进度反馈和错误处理机制
## 🏗️ 架构设计
### 整体架构图
```mermaid
graph TB
subgraph "video-flow-b 前端层"
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-b 后端"
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-b/
├── 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-b 的数据结构转换为 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-b格式 -> 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-b工作流进入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-b视频数据
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-b数据格式", () => {
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-b 项目文档](./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
**维护者**: 资深全栈开发工程师
**审核者**: 项目技术负责人