name: video-generator-plan overview: 为有声书项目新增图片+音频生成配图视频功能,采用FFmpeg方案,无需GPU,完全免费,适合快速上线。 design: styleKeywords:
- 卡片式布局
- 步骤导航
- 进度反馈
fontSystem:
fontFamily: system-ui
heading:
size: 18px
weight: 600
subheading:
size: 16px
weight: 500
body:
size: 14px
weight: 400
colorSystem:
primary:
- "#3B82F6"
- "#2563EB"
background:
- "#F5F5F5"
- "#FFFFFF"
text:
- "#333333"
- "#666666"
functional:
- "#10B981"
- "#EF4444"
- "#F59E0B"
todos:
基于 FFmpeg 将静态图片+音频合成带 Ken Burns 效果的视频,实现"有声书配图视频"生成功能。
使用 FFmpeg zoompan 滤镜实现图片动态效果:
# 缩放+平移动画示例
ffmpeg -loop 1 -i image.jpg -vf "zoompan=z='min(zoom+0.001,1.5)':d=125,trim=duration=5" -t 5 output.mp4
# 基础合成命令
ffmpeg -loop 1 -i image.jpg -i audio.mp3 \
-vf "zoompan=z='1+0.3*sin(0.1*t)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=250,setsar=1" \
-c:v libx264 -tune stillimage -c:a aac -b:a 192k \
-pix_fmt yuv420p -shortest output.mp4
使用 FFmpeg concat 滤镜实现多图自动切换
model VideoProject {
id Int @id @default(autoincrement())
userId Int?
title String // 项目标题
description String? // 描述
coverUrl String? // 封面图
// 素材配置(JSON存储)
configJson String? @db.LongText // VideoConfig JSON
// 输出视频
outputUrl String? // 生成后的视频URL
duration Int? // 视频时长(秒)
fileSize Int? // 文件大小(字节)
// 关联
bookId Int? // 关联的书籍ID(可选)
audioId Int? // 关联的音频ID(可选)
status String @default("draft") // draft, processing, completed, failed
progress Int @default(0) // 0-100
errorMsg String? @db.Text
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
book Book? @relation(fields: [bookId], references: [id])
audio Audio? @relation(fields: [audioId], references: [id])
}
interface VideoConfig {
// 图片配置
images: {
url: string; // 图片URL
duration: number; // 显示时长(秒)
transition: 'none' | 'fade' | 'slide'; // 转场效果
}[];
// 音频配置
audio: {
url: string; // 主音频URL(必填)
startTime?: number; // 音频开始时间(截取)
volume: number; // 音量 0-1
};
// 背景音乐配置(可选)
bgm?: {
url: string;
volume: number;
loop: boolean;
};
// 字幕配置(可选)
subtitle?: {
text: string;
position: 'top' | 'bottom' | 'center';
fontSize: number;
color: string;
backgroundColor?: string;
};
// 视频参数
video: {
width: number; // 视频宽度
height: number; // 视频高度
fps: number; // 帧率
bitrate: string; // 码率
};
// Ken Burns 效果参数
kenburns: {
enabled: boolean;
minZoom: number; // 最小缩放
maxZoom: number; // 最大缩放
panSpeed: number; // 平移速度
zoomSpeed: number; // 缩放速度
};
}
| 接口 | 方法 | 描述 |
|---|---|---|
/api/video/projects |
GET | 获取视频项目列表 |
/api/video/projects |
POST | 创建视频项目 |
/api/video/projects/:id |
GET | 获取项目详情 |
/api/video/projects/:id |
PUT | 更新项目配置 |
/api/video/projects/:id |
DELETE | 删除项目 |
/api/video/projects/:id/generate |
POST | 开始生成视频 |
/api/video/projects/:id/status |
GET | 获取生成状态 |
/api/video/materials |
GET | 获取预设素材库 |
/api/video/materials/upload |
POST | 上传自定义素材 |
/api/video/books/:bookId/generate |
POST | 从书籍生成视频(快捷接口) |
server/src/modules/video-generator/
├── video-generator.controller.ts # 控制器
├── video-generator.service.ts # 业务逻辑
├── video-generator.types.ts # 类型定义
├── video-generator.ffmpeg.ts # FFmpeg命令封装
├── video-generator.queue.ts # 生成任务队列
└── README.md # 模块文档
my-uniapp-vue3/src/pages/
├── video-generator/
│ ├── index.vue # 项目列表页
│ ├── create.vue # 创建/编辑项目
│ └── preview.vue # 视频预览页
my-uniapp-vue3/src/utils/
└── video-generator-api.ts # API调用封装
// 快捷生成流程
1. 用户在书籍生成页面点击"生成视频"
2. 自动跳转视频生成页面,预填:
- 书籍标题、描述
- 生成的章节内容作为字幕备选
- 已有TTS音频(如有)
3. 用户选择/上传配图素材
4. 生成视频
// 音频来源
1. 直接选择已有的 TTS 音频
2. 在视频生成页面临时调用 TTS
3. 上传外部音频文件