# 视频素材模型 **本文档引用的文件** - [video-generator.types.ts](file://server/src/modules/video-generator/video-generator.types.ts) - [video-generator.service.ts](file://server/src/modules/video-generator/video-generator.service.ts) - [video-generator.controller.ts](file://server/src/modules/video-generator/video-generator.controller.ts) - [video-generator.ffmpeg.ts](file://server/src/modules/video-generator/video-generator.ffmpeg.ts) - [schema.prisma](file://server/prisma/schema.prisma) - [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. [结论](#结论) ## 简介 AI有声书生成平台的视频素材模型是整个视频生成系统的核心数据结构。该模型支持图片、音频、模板等多种类型的素材管理,为有声书视频的自动生成提供了完整的素材管理体系。 本模型设计遵循以下原则: - **类型安全**:使用TypeScript确保编译时类型检查 - **扩展性**:支持多种素材类型和自定义分类 - **性能优化**:内置索引和缓存机制 - **易用性**:提供完整的CRUD操作接口 ## 项目结构 视频素材模型位于服务器端的视频生成模块中,采用分层架构设计: ```mermaid graph TB subgraph "前端层" FE1[视频生成页面] FE2[素材管理界面] FE3[进度监控] end subgraph "API层" API1[视频项目API] API2[素材管理API] API3[生成控制API] end subgraph "服务层" SVC1[视频生成服务] SVC2[素材管理服务] SVC3[配置解析服务] end subgraph "数据层" DB1[VideoMaterial表] DB2[VideoProject表] DB3[BookChapter表] end FE1 --> API1 FE2 --> API2 FE3 --> API3 API1 --> SVC1 API2 --> SVC2 API3 --> SVC1 SVC1 --> DB1 SVC1 --> DB2 SVC2 --> DB1 SVC3 --> DB1 ``` **图表来源** - [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) - [schema.prisma:332-350](file://server/prisma/schema.prisma#L332-L350) ## 核心组件 ### VideoMaterialDB 数据模型 VideoMaterialDB 是视频素材的核心数据模型,定义了完整的素材存储结构: | 字段名 | 类型 | 约束 | 描述 | 默认值 | |--------|------|------|------|--------| | id | number | 主键, 自增 | 素材唯一标识符 | - | | userId | number | 外键, 可空 | 关联用户ID | null | | type | string | 枚举, 必填 | 素材类型: image/audio/template | - | | name | string | 必填 | 素材名称 | - | | url | string | 文本, 必填 | 素材访问URL | - | | thumbnail | string | 文本, 可空 | 缩略图URL | null | | tags | string | 文本, 可空 | 标签数组(JSON格式) | null | | category | string | 字符串, 可空 | 分类标识 | null | | duration | number | 整数, 可空 | 时长(秒) | null | | size | number | 整数, 可空 | 文件大小(字节) | null | | width | number | 整数, 可空 | 宽度(像素) | null | | height | number | 整数, 可空 | 高度(像素) | null | | createdAt | Date | 时间戳 | 创建时间 | 当前时间 | | updatedAt | Date | 时间戳 | 更新时间 | 当前时间 | **章节来源** - [video-generator.types.ts:117-133](file://server/src/modules/video-generator/video-generator.types.ts#L117-L133) - [schema.prisma:332-350](file://server/prisma/schema.prisma#L332-L350) ### 素材类型系统 系统支持三种主要的素材类型: ```mermaid classDiagram class MaterialType { <> +image +audio +template } class VideoMaterialDB { +number id +number userId +string type +string name +string url +string thumbnail +string tags +string category +number duration +number size +number width +number height +Date createdAt +Date updatedAt } class ImageMaterial { +string url +number duration +TransitionEffect transition +KenBurnsConfig kenburns } class AudioMaterial { +string url +number startTime +number endTime +number volume } class TemplateMaterial { +string templateData +string layout } VideoMaterialDB --> MaterialType : "uses" ImageMaterial --> VideoMaterialDB : "extends" AudioMaterial --> VideoMaterialDB : "extends" TemplateMaterial --> VideoMaterialDB : "extends" ``` **图表来源** - [video-generator.types.ts:11-12](file://server/src/modules/video-generator/video-generator.types.ts#L11-L12) - [video-generator.types.ts:21-43](file://server/src/modules/video-generator/video-generator.types.ts#L21-L43) ### 素材分类体系 系统提供灵活的分类管理机制: | 分类类别 | 描述 | 示例 | |----------|------|------| | 自然风景 | 自然景观素材 | 山川、海洋、森林 | | 抽象艺术 | 装饰性图案 | 几何图形、纹理 | | 商务办公 | 专业场景素材 | 办公室、会议 | | 科技数码 | 现代科技元素 | 电路板、芯片 | | 生活方式 | 日常生活场景 | 家居、美食 | | 背景音乐 | BGM素材库 | 轻音乐、环境音 | **章节来源** - [video-generator.ts:107-115](file://my-uniapp-vue3/src/types/video-generator.ts#L107-L115) ## 架构概览 视频素材管理系统采用模块化架构,各组件职责清晰: ```mermaid sequenceDiagram participant Client as 客户端 participant Controller as 控制器 participant Service as 服务层 participant Prisma as 数据访问层 participant Database as MySQL数据库 Client->>Controller : POST /api/video/materials/upload Controller->>Controller : 验证请求参数 Controller->>Service : uploadMaterial(data, userId) Service->>Prisma : videoMaterial.create() Prisma->>Database : INSERT INTO VideoMaterial Database-->>Prisma : 新记录ID Prisma-->>Service : 返回素材对象 Service-->>Controller : 格式化响应 Controller-->>Client : 成功响应 Note over Client,Database : 素材上传完整流程 ``` **图表来源** - [video-generator.controller.ts:165-203](file://server/src/modules/video-generator/video-generator.controller.ts#L165-L203) - [video-generator.service.ts:385-420](file://server/src/modules/video-generator/video-generator.service.ts#L385-L420) ## 详细组件分析 ### 素材上传与存储 素材上传流程包含多个验证和处理步骤: ```mermaid flowchart TD Start([开始上传]) --> Validate["验证请求参数"] Validate --> CheckFile{"是否有文件上传?"} CheckFile --> |是| UploadFile["上传文件到服务器"] CheckFile --> |否| CheckURL["检查URL参数"] UploadFile --> GenURL["生成服务器URL"] CheckURL --> URLExists{"URL是否存在?"} URLExists --> |是| UseURL["使用提供的URL"] URLExists --> |否| Error["返回错误"] GenURL --> ProcessMeta["处理元数据"] UseURL --> ProcessMeta ProcessMeta --> SaveDB["保存到数据库"] SaveDB --> Success["返回成功响应"] Error --> End([结束]) Success --> End ``` **图表来源** - [video-generator.controller.ts:165-203](file://server/src/modules/video-generator/video-generator.controller.ts#L165-L203) - [video-generator.service.ts:385-420](file://server/src/modules/video-generator/video-generator.service.ts#L385-L420) ### 素材检索与过滤 系统提供灵活的素材检索机制: ```mermaid classDiagram class GetMaterialsQuery { +number userId +MaterialType type +string category +number page +number pageSize } class VideoMaterialResponse { +number id +number userId +MaterialType type +string name +string url +string thumbnail +string[] tags +string category +number duration +number size +number width +number height +Date createdAt +Date updatedAt } class MaterialFilter { +userId : number | null +type : MaterialType | null +category : string | null } GetMaterialsQuery --> MaterialFilter : "转换为" MaterialFilter --> VideoMaterialResponse : "查询结果" ``` **图表来源** - [video-generator.types.ts:173-180](file://server/src/modules/video-generator/video-generator.types.ts#L173-L180) - [video-generator.types.ts:182-198](file://server/src/modules/video-generator/video-generator.types.ts#L182-L198) ### 元数据管理 系统支持丰富的元数据管理功能: | 元数据类型 | 字段 | 用途 | 约束 | |------------|------|------|------| | 基础信息 | name, type | 标识和分类素材 | 必填 | | 媒体属性 | duration, size, width, height | 媒体规格信息 | 可空 | | 访问信息 | url, thumbnail | 文件访问和预览 | 必填 | | 分类标签 | category, tags | 搜索和组织素材 | 可空 | | 时间戳 | createdAt, updatedAt | 版本管理和排序 | 自动生成 | **章节来源** - [video-generator.types.ts:117-133](file://server/src/modules/video-generator/video-generator.types.ts#L117-L133) ### 素材生命周期管理 ```mermaid stateDiagram-v2 [*] --> 上传中 上传中 --> 待审核 : 上传完成 待审核 --> 可用 : 审核通过 待审核 --> 拒绝 : 审核失败 可用 --> 已使用 : 被项目引用 已使用 --> 可用 : 项目删除 拒绝 --> [*] 可用 --> 删除 : 用户删除 已使用 --> 删除 : 系统清理 删除 --> [*] ``` ## 依赖关系分析 ### 数据库关系 VideoMaterial模型与相关表的依赖关系: ```mermaid erDiagram VideoMaterial { int id PK int userId FK string type string name text url string thumbnail text tags string category int duration int size int width int height datetime createdAt datetime updatedAt } User { int id PK string phone UK string openid UK string nickname string avatar int memberLevel datetime createdAt datetime updatedAt } BookChapter { int id PK int bookId FK string audioUrl string videoUrl int videoDuration string content } VideoProject { int id PK int userId FK int chapterId FK string title string outputUrl int duration int fileSize string status } User ||--o{ VideoMaterial : "拥有" BookChapter ||--o{ VideoProject : "关联" VideoMaterial ||--|| VideoProject : "被引用" ``` **图表来源** - [schema.prisma:332-350](file://server/prisma/schema.prisma#L332-L350) - [schema.prisma:194-218](file://server/prisma/schema.prisma#L194-L218) ### 前后端交互 前后端的数据传输协议: ```mermaid sequenceDiagram participant Frontend as 前端应用 participant API as API接口 participant Backend as 后端服务 participant Database as 数据库 Frontend->>API : GET /api/video/materials API->>Backend : getMaterials(query) Backend->>Database : SELECT * FROM VideoMaterial Database-->>Backend : 素材列表 Backend-->>API : 格式化数据 API-->>Frontend : JSON响应 Frontend->>API : POST /api/video/materials/upload API->>Backend : uploadMaterial(data) Backend->>Database : INSERT INTO VideoMaterial Database-->>Backend : 成功 Backend-->>API : 素材信息 API-->>Frontend : 上传结果 ``` **图表来源** - [video-generator-api.ts:144-155](file://my-uniapp-vue3/src/utils/video-generator-api.ts#L144-L155) - [video-generator.controller.ts:165-203](file://server/src/modules/video-generator/video-generator.controller.ts#L165-L203) ## 性能考虑 ### 数据库优化 系统通过合理的索引设计提升查询性能: | 索引类型 | 字段组合 | 用途 | 性能收益 | |----------|----------|------|----------| | 复合索引 | userId, type | 用户素材分类查询 | O(log n) | | 复合索引 | type, category | 类型分类筛选 | O(log n) | | 时间索引 | createdAt | 按时间排序 | O(log n) | | 唯一索引 | url | 去重和快速查找 | O(1) | ### 缓存策略 ```mermaid graph LR subgraph "缓存层" Cache1[Redis缓存] Cache2[内存缓存] end subgraph "应用层" App1[素材列表缓存] App2[热门素材缓存] App3[分类统计缓存] end subgraph "持久层" DB1[MySQL数据库] FS1[文件存储] end Cache1 --> App1 Cache1 --> App2 Cache2 --> App3 App1 --> DB1 App2 --> DB1 App3 --> DB1 DB1 --> FS1 ``` ### CDN优化方案 对于视频素材的CDN分发,建议采用以下策略: 1. **静态资源CDN**:图片、音频等静态素材 2. **动态内容缓存**:用户私有素材的短期缓存 3. **边缘计算**:热点素材的就近分发 4. **智能压缩**:根据设备能力自动调整质量 ## 故障排除指南 ### 常见问题及解决方案 | 问题类型 | 症状 | 可能原因 | 解决方案 | |----------|------|----------|----------| | 上传失败 | 400错误 | 文件格式不支持 | 检查文件类型和大小限制 | | 查询异常 | 数据缺失 | 权限不足 | 验证用户认证和授权 | | 存储错误 | 磁盘空间不足 | 磁盘满 | 清理临时文件和过期素材 | | 查询超时 | 响应缓慢 | 缺少索引 | 添加适当的数据库索引 | ### 错误处理机制 系统提供完善的错误处理和日志记录: ```mermaid flowchart TD Request[请求到达] --> Validate[参数验证] Validate --> Valid{"验证通过?"} Valid --> |否| ErrorResp[返回错误] Valid --> |是| Process[处理请求] Process --> Success{"处理成功?"} Success --> |否| LogError[记录错误日志] Success --> |是| ReturnOK[返回成功响应] LogError --> ErrorResp ``` **章节来源** - [video-generator.service.ts:291-311](file://server/src/modules/video-generator/video-generator.service.ts#L291-L311) ## 结论 视频素材模型为AI有声书生成平台提供了完整的素材管理基础设施。通过精心设计的数据结构、完善的API接口和优化的性能策略,系统能够高效地管理各种类型的媒体素材。 关键优势包括: - **类型安全**:完整的TypeScript类型定义确保代码质量 - **扩展性强**:支持多种素材类型和自定义分类 - **性能优化**:合理的数据库设计和缓存策略 - **易于维护**:清晰的模块划分和错误处理机制 该模型为后续的功能扩展和性能优化奠定了坚实的基础,能够满足大规模视频素材管理的需求。