本文引用的文件
本文件面向“媒体格式支持”主题,系统梳理音频与视频在本项目中的支持矩阵、编解码标准、压缩算法、FFmpeg 集成方案、编解码器配置、格式转换流程、质量评估与比特率策略、采样率与帧率适配、元数据处理与字幕封面管理、兼容性测试与性能基准、以及格式选择指南与最佳实践。文档以代码为依据,辅以可视化图示帮助理解。
围绕媒体格式支持的关键模块与文件如下:
存储与配置:storage.service(OSS/本地统一存储)、config(模型与环境配置)
graph TB
subgraph "音频处理"
A1["FFmpegProcessor<br/>格式转换/合并/裁剪/音量/时长"]
A2["AudioMerger<br/>本地/远程合并"]
end
subgraph "视频生成"
V1["video-generator.ffmpeg<br/>滤镜/输出配置"]
V2["video-generator.types<br/>类型与预设"]
V3["video-generator.service<br/>业务流程/进度"]
V4["video-generator.controller<br/>REST API"]
end
subgraph "基础设施"
S1["storage.service<br/>OSS/本地存储"]
C1["config/index.ts<br/>环境与模型配置"]
end
A1 --> S1
A2 --> A1
V3 --> V1
V3 --> V2
V4 --> V3
V1 --> S1
C1 --> V3
图表来源
章节来源
章节来源
媒体处理链路自上而下分为三层:
处理层:ffmpeg.processor 与 video-generator.ffmpeg 执行具体媒体操作;storage.service 负责持久化与访问。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "video-generator.controller"
participant Svc as "video-generator.service"
participant Ffm as "FFmpegProcessor/video-generator.ffmpeg"
participant Store as "storage.service"
Client->>Ctrl : "POST /api/video/projects/ : id/generate"
Ctrl->>Svc : "generateVideoForProject(id)"
Svc->>Svc : "校验状态/准备配置/解析素材"
Svc->>Ffm : "生成视频(含滤镜/输出)"
Ffm->>Store : "上传输出文件"
Store-->>Ffm : "返回访问URL"
Ffm-->>Svc : "返回时长/大小"
Svc->>Svc : "更新项目状态/进度/章节关联"
Svc-->>Ctrl : "返回结果"
Ctrl-->>Client : "生成完成/进度"
图表来源
典型流程(格式转换)
下载远程/本地文件 → 生成转换命令 → 执行 → 上传 → 返回 URL。
flowchart TD
Start(["开始"]) --> Detect["检测输入URL/本地路径"]
Detect --> Download["下载到临时目录"]
Download --> BuildCmd["构建FFmpeg命令<br/>选择编码器/比特率"]
BuildCmd --> Exec["执行转换"]
Exec --> Upload["上传至存储服务"]
Upload --> Done(["完成"])
图表来源
章节来源
时长探测
通过 ffprobe 获取 format.duration,支持远程 URL(经下载后探测)。
sequenceDiagram
participant Caller as "调用方"
participant AM as "AudioMerger"
participant FP as "FFmpegProcessor"
participant FS as "本地FS"
Caller->>AM : "merge(inputFiles, outputPath)"
alt 包含远程URL
AM->>FP : "mergeAudio(urls, ext)"
FP->>FP : "downloadFile() + 构建列表"
FP->>FP : "执行ffmpeg合并"
FP-->>AM : "返回存储URL"
else 全部本地
AM->>FS : "写入列表/执行ffmpeg"
FS-->>AM : "返回输出路径"
end
AM-->>Caller : "返回结果"
图表来源
章节来源
输出参数
preset/fast、crf 18、pix_fmt yuv420p、shortest(以较短媒体为准)等参数平衡速度与质量。
classDiagram
class VideoConfig {
+images : ImageConfig[]
+audio : AudioConfig
+bgm? : BgmConfig
+subtitle? : SubtitleConfig
+video : VideoParams
+kenburns : KenBurnsConfig
}
class VideoParams {
+width : number
+height : number
+fps : number
+bitrate : string
+format : string
}
class KenBurnsConfig {
+enabled : boolean
+minZoom : number
+maxZoom : number
}
class AudioConfig {
+url : string
+volume : number
}
class BgmConfig {
+url : string
+volume : number
+loop : boolean
}
class SubtitleConfig {
+text : string
+fontSize? : number
+fontColor? : string
+position : SubtitlePosition
}
VideoConfig --> VideoParams
VideoConfig --> KenBurnsConfig
VideoConfig --> AudioConfig
VideoConfig --> BgmConfig
VideoConfig --> SubtitleConfig
图表来源
章节来源
进度与元数据:监听 FFmpeg 进度事件,生成完成后 ffprobe 获取时长与文件大小。
sequenceDiagram
participant Svc as "video-generator.service"
participant Gen as "video-generator.ffmpeg"
participant FF as "FFmpeg命令"
participant Probe as "ffprobe"
Svc->>Gen : "generateVideo(image,audio,output,config)"
Gen->>FF : "构建滤镜(scale/pad/zoompan/drawtext)"
Gen->>FF : "设置输出参数(libx264,aac,yuv420p)"
FF-->>Gen : "生成完成"
Gen->>Probe : "获取时长/大小"
Probe-->>Gen : "返回元数据"
Gen-->>Svc : "返回时长/大小"
图表来源
章节来源
章节来源
章节来源
循环依赖
未见循环导入;模块职责清晰,通过 service 层协调。
graph LR
Ctrl["video-generator.controller"] --> Svc["video-generator.service"]
Svc --> Ffm["video-generator.ffmpeg"]
Svc --> Proc["FFmpegProcessor"]
Ffm --> Store["storage.service"]
Proc --> Store
Svc --> Types["video-generator.types"]
图表来源
章节来源
[本节为通用指导,无需特定文件引用]
章节来源
本项目通过 FFmpegProcessor 与 video-generator.* 模块实现了完整的媒体格式支持与处理链路:音频方面覆盖格式转换、合并、裁剪、音量调整与时长探测;视频方面覆盖滤镜、分辨率/帧率适配、字幕、背景音乐混音与输出。结合统一存储抽象与类型定义,形成可扩展、可维护且具备良好兼容性的媒体处理体系。
[本节为总结,无需特定文件引用]
[本节为通用指导,无需特定文件引用]
章节来源
章节来源
[本节为通用指导,无需特定文件引用]
[本节为通用指导,无需特定文件引用]