本文档引用的文件
本系统是一个基于 FFmpeg 的视频生成平台,支持将静态图片与音频合成生成视频,内置 Ken Burns 效果、字幕叠加、背景音乐混音、多图轮播等能力。系统采用前后端分离架构:后端使用 Node.js + TypeScript + Koa,前端使用 uniapp-vue3,通过 RESTful API 进行交互。系统提供完整的视频项目生命周期管理、素材管理、进度监控与结果预览功能,并支持 OSS 与本地存储的无缝切换。
后端模块位于 server/src/modules/video-generator,包含控制器、服务层、FFmpeg 封装与类型定义;服务层提供统一存储接口;前端位于 my-uniapp-vue3,包含视频生成页面与 API 封装。
graph TB
subgraph "后端"
A["Koa 应用<br/>app.ts"]
B["视频生成控制器<br/>video-generator.controller.ts"]
C["视频生成服务<br/>video-generator.service.ts"]
D["FFmpeg 封装<br/>video-generator.ffmpeg.ts"]
E["通用 FFmpeg 处理器<br/>ffmpeg.processor.ts"]
F["存储服务<br/>storage.service.ts"]
end
subgraph "前端"
G["视频生成页面<br/>create.vue"]
H["项目列表页面<br/>index.vue"]
I["API 封装<br/>video-generator-api.ts"]
J["类型定义<br/>video-generator.ts"]
end
A --> B --> C --> D
C --> E
C --> F
G --> I
H --> I
I --> B
图表来源
章节来源
章节来源
系统采用分层架构:
存储层:统一存储服务,支持 OSS 与本地存储。
graph TB
FE["前端页面<br/>create.vue/index.vue"]
API["API 封装<br/>video-generator-api.ts"]
CTRL["控制器<br/>video-generator.controller.ts"]
SVC["服务层<br/>video-generator.service.ts"]
FFMPEG["FFmpeg 封装<br/>video-generator.ffmpeg.ts"]
PROC["通用处理器<br/>ffmpeg.processor.ts"]
STORE["存储服务<br/>storage.service.ts"]
FE --> API --> CTRL --> SVC --> FFMPEG
SVC --> PROC
SVC --> STORE
FFMPEG --> STORE
图表来源
提供快捷入口:从书籍生成视频项目。
sequenceDiagram
participant FE as "前端"
participant API as "API 封装"
participant CTRL as "控制器"
participant SVC as "服务层"
participant FFMPEG as "FFmpeg 封装"
FE->>API : 调用生成视频
API->>CTRL : POST /api/video/projects/{id}/generate
CTRL->>SVC : generateVideoForProject(id)
SVC->>FFMPEG : generateVideo(image,audio,output,config)
FFMPEG-->>SVC : {duration,fileSize}
SVC-->>CTRL : {success,outputUrl,duration,fileSize}
CTRL-->>FE : 返回结果
图表来源
章节来源
从书籍生成视频项目:自动关联章节音频与标题。
flowchart TD
Start(["开始生成"]) --> LoadProj["加载项目"]
LoadProj --> CheckStatus{"状态是否为 processing?"}
CheckStatus --> |是| Fail["返回错误: 正在生成中"]
CheckStatus --> |否| UpdateStatus["更新状态为 processing"]
UpdateStatus --> CheckMedia{"音频/图片是否存在?"}
CheckMedia --> |否| Fail
CheckMedia --> |是| GenVideo["调用 FFmpeg 生成视频"]
GenVideo --> SaveResult["保存结果并更新状态"]
SaveResult --> Done(["完成"])
Fail --> End(["结束"])
Done --> End
图表来源
章节来源
视频信息获取:通过 ffprobe 获取时长、分辨率与文件大小。
classDiagram
class FFmpeg封装 {
+generateVideo(imagePath, audioPath, outputPath, config)
+generateVideoWithBgm(imagePath, audioPath, bgmPath, outputPath, config)
+generateSlideshow(images, audioPath, outputPath, config)
+getVideoInfo(filePath)
}
class 视频配置 {
+images : ImageConfig[]
+audio : AudioConfig
+bgm? : BgmConfig
+subtitle? : SubtitleConfig
+video : VideoParams
+kenburns : KenBurnsConfig
}
FFmpeg封装 --> 视频配置 : "使用"
图表来源
章节来源
临时文件清理:保证磁盘空间。
flowchart TD
Download["下载远程文件"] --> Merge["音频合并/音视频混合"]
Merge --> Convert["格式转换/裁剪/音量调整"]
Convert --> Upload["上传到存储"]
Upload --> Cleanup["清理临时文件"]
图表来源
章节来源
自动切换存储类型,便于部署与迁移。
classDiagram
class 存储服务 {
+setStorageType(type)
+getStorageType()
+uploadAudio(localPath, audioId)
+uploadVideo(localPath, videoId)
+uploadFile(localPath, category, id)
+downloadFile(url)
+deleteFile(url)
+getSignedUrl(url, expires)
}
存储服务 : "支持 OSS 与本地存储"
图表来源
章节来源
API 封装:统一请求与响应处理。
sequenceDiagram
participant Page as "创建页"
participant API as "API 封装"
participant Ctrl as "控制器"
participant Svc as "服务层"
Page->>API : 保存项目
API->>Ctrl : POST /api/video/projects
Ctrl->>Svc : createVideoProject
Svc-->>Ctrl : 返回项目
Ctrl-->>API : 返回项目
API-->>Page : 保存成功
Page->>API : 开始生成
API->>Ctrl : POST /api/video/projects/{id}/generate
Ctrl->>Svc : generateVideoForProject
Svc-->>Ctrl : 返回进度
Ctrl-->>API : 返回进度
API-->>Page : 轮询进度
图表来源
章节来源
应用启动时注册路由并挂载静态资源。
graph LR
CTRL["控制器"] --> SVC["服务层"]
SVC --> FFMPEG["FFmpeg 封装"]
SVC --> PROC["通用处理器"]
SVC --> STORE["存储服务"]
FE["前端"] --> API["API 封装"] --> CTRL
APP["应用启动"] --> CTRL
APP --> STORE
图表来源
章节来源
[本节为通用性能指导,无需特定文件引用]
章节来源
该视频生成系统通过清晰的分层架构与完善的 FFmpeg 封装,实现了从图片与音频到成品视频的自动化处理。系统支持 Ken Burns 效果、字幕叠加与背景音乐混音,具备良好的扩展性与可维护性。结合统一存储服务与前端交互,能够满足移动端与 Web 端的视频生成需求。
[本节为总结性内容,无需特定文件引用]
章节来源
章节来源
章节来源
章节来源
章节来源
[本节为通用策略建议,无需特定文件引用]