# 视频生成系统 **本文档引用的文件** - [video-generator.controller.ts](file://server/src/modules/video-generator/video-generator.controller.ts) - [video-generator.service.ts](file://server/src/modules/video-generator/video-generator.service.ts) - [video-generator.ffmpeg.ts](file://server/src/modules/video-generator/video-generator.ffmpeg.ts) - [video-generator.types.ts](file://server/src/modules/video-generator/video-generator.types.ts) - [ffmpeg.processor.ts](file://server/src/services/ffmpeg.processor.ts) - [storage.service.ts](file://server/src/services/storage.service.ts) - [app.ts](file://server/src/app.ts) - [README.md](file://server/src/modules/video-generator/README.md) - [video-generator.ts](file://my-uniapp-vue3/src/types/video-generator.ts) - [video-generator-api.ts](file://my-uniapp-vue3/src/utils/video-generator-api.ts) - [create.vue](file://my-uniapp-vue3/src/pages/video-generator/create.vue) - [index.vue](file://my-uniapp-vue3/src/pages/video-generator/index.vue) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本系统是一个基于 FFmpeg 的视频生成平台,支持将静态图片与音频合成生成视频,内置 Ken Burns 效果、字幕叠加、背景音乐混音、多图轮播等能力。系统采用前后端分离架构:后端使用 Node.js + TypeScript + Koa,前端使用 uniapp-vue3,通过 RESTful API 进行交互。系统提供完整的视频项目生命周期管理、素材管理、进度监控与结果预览功能,并支持 OSS 与本地存储的无缝切换。 ## 项目结构 后端模块位于 server/src/modules/video-generator,包含控制器、服务层、FFmpeg 封装与类型定义;服务层提供统一存储接口;前端位于 my-uniapp-vue3,包含视频生成页面与 API 封装。 ```mermaid graph TB subgraph "后端" A["Koa 应用
app.ts"] B["视频生成控制器
video-generator.controller.ts"] C["视频生成服务
video-generator.service.ts"] D["FFmpeg 封装
video-generator.ffmpeg.ts"] E["通用 FFmpeg 处理器
ffmpeg.processor.ts"] F["存储服务
storage.service.ts"] end subgraph "前端" G["视频生成页面
create.vue"] H["项目列表页面
index.vue"] I["API 封装
video-generator-api.ts"] J["类型定义
video-generator.ts"] end A --> B --> C --> D C --> E C --> F G --> I H --> I I --> B ``` 图表来源 - [app.ts:1-194](file://server/src/app.ts#L1-L194) - [video-generator.controller.ts:1-244](file://server/src/modules/video-generator/video-generator.controller.ts#L1-L244) - [video-generator.service.ts:1-556](file://server/src/modules/video-generator/video-generator.service.ts#L1-L556) - [video-generator.ffmpeg.ts:1-300](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L1-L300) - [ffmpeg.processor.ts:1-379](file://server/src/services/ffmpeg.processor.ts#L1-L379) - [storage.service.ts:1-278](file://server/src/services/storage.service.ts#L1-L278) - [create.vue:1-365](file://my-uniapp-vue3/src/pages/video-generator/create.vue#L1-L365) - [index.vue:1-482](file://my-uniapp-vue3/src/pages/video-generator/index.vue#L1-L482) - [video-generator-api.ts:1-188](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L1-L188) - [video-generator.ts:1-116](file://my-uniapp-vue3/src/types/video-generator.ts#L1-L116) 章节来源 - [README.md:23-40](file://server/src/modules/video-generator/README.md#L23-L40) - [app.ts:100-130](file://server/src/app.ts#L100-L130) ## 核心组件 - 视频生成控制器:提供 RESTful API,负责视频项目管理、生成触发与进度查询。 - 视频生成服务:封装业务逻辑,协调素材校验、文件下载、进度更新与状态管理。 - FFmpeg 封装:提供图片+音频合成、Ken Burns 效果、字幕叠加、背景音乐混音、多图轮播等能力。 - 通用 FFmpeg 处理器:支持远程 URL 下载、音频合并、音视频混合、格式转换、裁剪与音量调整等。 - 存储服务:统一 OSS 与本地存储接口,支持上传、下载、删除与签名 URL。 - 前端页面与 API:提供视频项目创建、素材选择、生成进度监控与结果预览。 章节来源 - [video-generator.controller.ts:20-244](file://server/src/modules/video-generator/video-generator.controller.ts#L20-L244) - [video-generator.service.ts:30-312](file://server/src/modules/video-generator/video-generator.service.ts#L30-L312) - [video-generator.ffmpeg.ts:20-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L20-L280) - [ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379) - [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) - [video-generator-api.ts:76-188](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L76-L188) ## 架构总览 系统采用分层架构: - 表现层:uniapp-vue3 前端页面与 API 封装。 - 控制层:Koa 路由与控制器,处理请求与响应。 - 业务层:视频生成服务,协调数据与流程。 - 处理层:FFmpeg 封装与通用处理器,执行底层视频处理。 - 存储层:统一存储服务,支持 OSS 与本地存储。 ```mermaid graph TB FE["前端页面
create.vue/index.vue"] API["API 封装
video-generator-api.ts"] CTRL["控制器
video-generator.controller.ts"] SVC["服务层
video-generator.service.ts"] FFMPEG["FFmpeg 封装
video-generator.ffmpeg.ts"] PROC["通用处理器
ffmpeg.processor.ts"] STORE["存储服务
storage.service.ts"] FE --> API --> CTRL --> SVC --> FFMPEG SVC --> PROC SVC --> STORE FFMPEG --> STORE ``` 图表来源 - [create.vue:107-315](file://my-uniapp-vue3/src/pages/video-generator/create.vue#L107-L315) - [index.vue:108-254](file://my-uniapp-vue3/src/pages/video-generator/index.vue#L108-L254) - [video-generator-api.ts:76-188](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L76-L188) - [video-generator.controller.ts:20-244](file://server/src/modules/video-generator/video-generator.controller.ts#L20-L244) - [video-generator.service.ts:154-312](file://server/src/modules/video-generator/video-generator.service.ts#L154-L312) - [video-generator.ffmpeg.ts:20-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L20-L280) - [ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379) - [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) ## 详细组件分析 ### 视频生成控制器 - 提供视频项目管理接口:创建、查询、更新、删除。 - 提供生成触发与进度查询接口:开始生成、获取状态。 - 提供素材管理接口:列表、上传、删除。 - 提供快捷入口:从书籍生成视频项目。 ```mermaid 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 : 返回结果 ``` 图表来源 - [video-generator.controller.ts:111-129](file://server/src/modules/video-generator/video-generator.controller.ts#L111-L129) - [video-generator.service.ts:154-312](file://server/src/modules/video-generator/video-generator.service.ts#L154-L312) - [video-generator.ffmpeg.ts:23-118](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L23-L118) 章节来源 - [video-generator.controller.ts:20-244](file://server/src/modules/video-generator/video-generator.controller.ts#L20-L244) ### 视频生成服务 - 视频项目管理:创建、查询、更新、删除。 - 生成流程:状态检查、素材校验、文件下载、进度更新、结果写回。 - 素材管理:上传、查询、删除。 - 从书籍生成视频项目:自动关联章节音频与标题。 ```mermaid 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 ``` 图表来源 - [video-generator.service.ts:154-312](file://server/src/modules/video-generator/video-generator.service.ts#L154-L312) - [video-generator.ffmpeg.ts:23-118](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L23-L118) 章节来源 - [video-generator.service.ts:30-312](file://server/src/modules/video-generator/video-generator.service.ts#L30-L312) ### FFmpeg 封装 - 图片+音频合成:支持 Ken Burns 效果、缩放与填充、字幕叠加。 - 背景音乐混音:支持主音频与背景音乐混合。 - 多图轮播:支持多张图片按时序拼接。 - 视频信息获取:通过 ffprobe 获取时长、分辨率与文件大小。 ```mermaid 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封装 --> 视频配置 : "使用" ``` 图表来源 - [video-generator.ffmpeg.ts:20-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L20-L280) - [video-generator.types.ts:74-93](file://server/src/modules/video-generator/video-generator.types.ts#L74-L93) 章节来源 - [video-generator.ffmpeg.ts:20-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L20-L280) ### 通用 FFmpeg 处理器 - 远程文件下载:支持 HTTP/HTTPS 与本地路径。 - 音频合并:支持多个音频文件拼接。 - 音视频混合:支持替换音频或混合背景音乐。 - 音频格式转换、裁剪与音量调整。 - 临时文件清理:保证磁盘空间。 ```mermaid flowchart TD Download["下载远程文件"] --> Merge["音频合并/音视频混合"] Merge --> Convert["格式转换/裁剪/音量调整"] Convert --> Upload["上传到存储"] Upload --> Cleanup["清理临时文件"] ``` 图表来源 - [ffmpeg.processor.ts:30-379](file://server/src/services/ffmpeg.processor.ts#L30-L379) 章节来源 - [ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379) ### 存储服务 - 统一 OSS 与本地存储接口,支持上传、下载、删除与签名 URL。 - 自动切换存储类型,便于部署与迁移。 ```mermaid classDiagram class 存储服务 { +setStorageType(type) +getStorageType() +uploadAudio(localPath, audioId) +uploadVideo(localPath, videoId) +uploadFile(localPath, category, id) +downloadFile(url) +deleteFile(url) +getSignedUrl(url, expires) } 存储服务 : "支持 OSS 与本地存储" ``` 图表来源 - [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) 章节来源 - [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) ### 前端页面与 API - 视频生成页面:三步式向导,支持素材选择、效果配置与生成。 - 项目列表页面:展示项目状态、进度与结果操作。 - API 封装:统一请求与响应处理。 ```mermaid 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 : 轮询进度 ``` 图表来源 - [create.vue:268-312](file://my-uniapp-vue3/src/pages/video-generator/create.vue#L268-L312) - [video-generator-api.ts:98-139](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L98-L139) - [video-generator.controller.ts:111-139](file://server/src/modules/video-generator/video-generator.controller.ts#L111-L139) - [video-generator.service.ts:154-312](file://server/src/modules/video-generator/video-generator.service.ts#L154-L312) 章节来源 - [create.vue:107-315](file://my-uniapp-vue3/src/pages/video-generator/create.vue#L107-L315) - [index.vue:108-254](file://my-uniapp-vue3/src/pages/video-generator/index.vue#L108-L254) - [video-generator-api.ts:76-188](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L76-L188) ## 依赖关系分析 - 控制器依赖服务层;服务层依赖 FFmpeg 封装与存储服务;通用处理器作为独立工具被服务层调用。 - 前端通过 API 封装调用后端接口。 - 应用启动时注册路由并挂载静态资源。 ```mermaid graph LR CTRL["控制器"] --> SVC["服务层"] SVC --> FFMPEG["FFmpeg 封装"] SVC --> PROC["通用处理器"] SVC --> STORE["存储服务"] FE["前端"] --> API["API 封装"] --> CTRL APP["应用启动"] --> CTRL APP --> STORE ``` 图表来源 - [app.ts:100-130](file://server/src/app.ts#L100-L130) - [video-generator.controller.ts:20-244](file://server/src/modules/video-generator/video-generator.controller.ts#L20-L244) - [video-generator.service.ts:154-312](file://server/src/modules/video-generator/video-generator.service.ts#L154-L312) - [ffmpeg.processor.ts:24-379](file://server/src/services/ffmpeg.processor.ts#L24-L379) - [storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) 章节来源 - [app.ts:100-130](file://server/src/app.ts#L100-L130) ## 性能考虑 - FFmpeg 参数优化 - 视频编码:使用 libx264,preset 设置为 fast,CRF 18,码率自适应以平衡质量与体积。 - 音频编码:AAC,码率 192k,满足大多数场景。 - 像素格式:yuv420p,兼容性最佳。 - 最短时长:-shortest,避免音频过长导致黑屏。 - Ken Burns 效果 - zoompan 滤镜参数:minZoom/maxZoom 控制缩放范围,fps 控制平滑度,s 指定目标分辨率。 - 字幕渲染 - drawtext 滤镜:合理设置字体大小、颜色与描边,避免遮挡画面主体。 - 并发与资源控制 - 建议限制同时生成任务数量,防止 CPU/内存耗尽。 - 合理设置超时时间,避免长时间占用进程。 - 存储与临时文件 - 定期清理 temp 目录,避免磁盘空间不足。 - 使用 SSD 提升 I/O 性能。 [本节为通用性能指导,无需特定文件引用] ## 故障排除指南 - FFmpeg 依赖缺失 - 确保服务器已安装 FFmpeg,并加入 PATH。 - 权限问题 - public/videos 与 temp 目录需具备写权限。 - 进度查询异常 - 检查项目状态字段与数据库连接。 - 生成失败 - 查看服务日志中的错误堆栈,定位具体环节(下载、FFmpeg 执行、存储上传)。 - 前端无法预览 - 检查静态资源挂载与 CORS 配置。 章节来源 - [README.md:186-192](file://server/src/modules/video-generator/README.md#L186-L192) - [app.ts:70-90](file://server/src/app.ts#L70-L90) ## 结论 该视频生成系统通过清晰的分层架构与完善的 FFmpeg 封装,实现了从图片与音频到成品视频的自动化处理。系统支持 Ken Burns 效果、字幕叠加与背景音乐混音,具备良好的扩展性与可维护性。结合统一存储服务与前端交互,能够满足移动端与 Web 端的视频生成需求。 [本节为总结性内容,无需特定文件引用] ## 附录 ### FFmpeg 命令行参数配置要点 - 视频编码 - -c:v libx264:H.264 编码器 - -preset fast:编码速度优先 - -crf 18:质量控制,数值越低质量越高 - -pix_fmt yuv420p:兼容性像素格式 - 音频编码 - -c:a aac:AAC 编码 - -b:a 192k:音频比特率 - 最短时长 - -shortest:以最短输入为准结束 - Ken Burns 效果 - zoompan:缩放与平移动画 - z/x/y/d/s/fps:缩放比例、中心点、帧间隔、分辨率、帧率 - 字幕叠加 - drawtext:文本绘制,支持字体大小、颜色、描边与位置 章节来源 - [video-generator.ffmpeg.ts:87-98](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L87-L98) - [video-generator.ffmpeg.ts:169-186](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L169-L186) - [video-generator.ffmpeg.ts:252-262](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L252-L262) ### 视频合成算法与流程 - 图片+音频合成 - 输入:单张图片(循环)、音频文件 - 处理:Ken Burns 效果、缩放与填充、字幕叠加 - 输出:MP4 视频 - 背景音乐混音 - 输入:图片(循环)、主音频、背景音乐 - 处理:主音频与背景音乐混合,映射到视频音频轨道 - 输出:MP4 视频 - 多图轮播 - 输入:多张图片列表、音频文件 - 处理:拼接图片序列,缩放与填充,字幕叠加 - 输出:MP4 视频 章节来源 - [video-generator.ffmpeg.ts:23-118](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L23-L118) - [video-generator.ffmpeg.ts:123-199](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L123-L199) - [video-generator.ffmpeg.ts:204-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L204-L280) ### 字幕生成与渲染 - 字幕位置:支持顶部、中部、底部三种位置,动态计算 Y 坐标。 - 字体样式:支持字体大小、颜色、描边与边距。 - 文本内容:来自配置对象,支持章节标题等动态内容。 章节来源 - [video-generator.ffmpeg.ts:67-83](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L67-L83) - [video-generator.ffmpeg.ts:233-248](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L233-L248) ### 视频格式转换 - 支持 MP3、WAV、AAC 等常见音频格式转换。 - 通过通用处理器执行转换命令,完成后上传至存储服务。 章节来源 - [ffmpeg.processor.ts:217-261](file://server/src/services/ffmpeg.processor.ts#L217-L261) ### 内存管理策略 - 临时文件管理:下载与处理过程产生的中间文件在完成后清理。 - 进度回调:监听 FFmpeg 进度,避免阻塞主线程。 - 超时控制:为长耗时操作设置超时,防止资源泄漏。 章节来源 - [ffmpeg.processor.ts:346-375](file://server/src/services/ffmpeg.processor.ts#L346-L375) - [video-generator.ffmpeg.ts:100-117](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L100-L117) ### 批量处理策略 - 任务队列:建议引入队列服务,限制并发数量。 - 断点续传:记录生成进度,异常恢复后继续。 - 资源监控:监控 CPU、内存与磁盘使用,动态调整并发。 [本节为通用策略建议,无需特定文件引用] ### 代码示例路径 - 调用 FFmpeg 进行视频处理 - [video-generator.ffmpeg.ts:23-118](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L23-L118) - [video-generator.ffmpeg.ts:123-199](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L123-L199) - [video-generator.ffmpeg.ts:204-280](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L204-L280) - 实现字幕同步 - [video-generator.ffmpeg.ts:67-83](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L67-L83) - [video-generator.ffmpeg.ts:233-248](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L233-L248) - 优化视频质量 - [video-generator.ffmpeg.ts:87-98](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L87-L98) - [video-generator.ffmpeg.ts:169-186](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L169-L186) - [video-generator.ffmpeg.ts:252-262](file://server/src/modules/video-generator/video-generator.ffmpeg.ts#L252-L262)