音频处理接口
目录
简介
本文档介绍音频处理接口,聚焦以下两个核心能力:
- 批量添加音频到剪映草稿的接口 /v1/add_audios,包括请求参数、音频信息数据结构、时间线布局、音量控制与音频效果应用
- 音频时长获取接口 /v1/get_audio_duration 的使用方法与响应格式
文档提供最佳实践建议,包括音频同步、多轨混合与音频效果处理策略,并给出常见问题排查方法。
项目结构
音频处理的代码组织遵循“路由层 → 模型层 → 服务层 → 工具层”的分层设计,配合剪映草稿底层模型与轨道系统完成音频片段的创建与管理。
graph TB
subgraph "路由层"
R1["/v1/add_audios<br/>POST"]
R2["/v1/get_audio_duration<br/>POST"]
end
subgraph "模型层Pydantic"
S1["AddAudiosRequest/Response"]
S2["GetAudioDurationRequest/Response"]
end
subgraph "服务层"
A1["add_audios(...)"]
A2["get_audio_duration(...)"]
end
subgraph "工具与底层"
U1["download(...)"]
U2["get_media_duration(...)"]
L1["AudioSegment / AudioEffect"]
L2["Track / TrackType"]
C1["config.py 常量"]
E1["exceptions.py 错误码"]
end
R1 --> S1
R2 --> S2
R1 --> A1
R2 --> A2
A1 --> U1
A1 --> U2
A1 --> L1
A1 --> L2
A2 --> U1
A2 --> U2
A1 --> C1
A2 --> C1
A1 --> E1
A2 --> E1
核心组件
- 路由接口
- /v1/add_audios:接收草稿URL与音频信息JSON字符串,返回更新后的草稿URL、新增音频轨道ID与音频片段ID列表
- /v1/get_audio_duration:接收音频URL,返回音频时长(微秒)
- 数据模型
- AddAudiosRequest/Response:定义请求与响应字段
- GetAudioDurationRequest/Response:定义请求与响应字段
- 服务逻辑
- add_audios(...):解析音频信息、创建音频轨道、批量添加音频片段、应用音量与效果、保存草稿
- get_audio_duration(...):下载音频、检测时长、清理临时文件
- 工具与底层
- download(...):通用下载器
- get_media_duration(...):基于ffprobe的媒体时长检测
- AudioSegment/AudioEffect:音频片段与效果对象
- Track/TrackType:轨道类型与片段添加约束
架构总览
下图展示 /v1/add_audios 的端到端调用链路与关键处理步骤:
sequenceDiagram
participant Client as "客户端"
participant Router as "路由层(v1)"
participant Schema as "模型层(Pydantic)"
participant Service as "服务层(add_audios)"
participant Utils as "工具(download/get_media_duration)"
participant Draft as "剪映草稿模型(AudioSegment/Track)"
Client->>Router : POST /v1/add_audios
Router->>Schema : 校验请求参数
Router->>Service : 调用 add_audios(draft_url, audio_infos)
Service->>Service : 解析/校验 audio_infos
Service->>Utils : 下载音频文件
Utils-->>Service : 本地音频路径
Service->>Utils : 检测音频时长
Utils-->>Service : 时长(微秒)
Service->>Service : 计算片段时间范围/音量/效果
Service->>Draft : 创建音频轨道
Service->>Draft : 创建 AudioSegment 并添加到轨道
Service->>Service : 保存草稿
Service-->>Router : 返回 draft_url, track_id, audio_ids
Router-->>Client : 200 OK 响应
详细组件分析
/v1/add_audios 接口
- 接口定位
- 批量向现有草稿添加音频素材,音频位于独立音频轨道,不影响视频内容
- 请求参数
- draft_url:目标草稿URL(必填)
- audio_infos:JSON字符串数组,每项包含 audio_url、start、end、duration(可选)、volume(可选)、audio_effect(可选)
- 响应参数
- draft_url:更新后的草稿URL
- track_id:新增音频轨道ID
- audio_ids:本次添加的音频片段ID列表
- 时间线布局与片段创建
- 服务层会下载音频、检测实际时长,并根据 start/end 计算片段目标时间范围;若请求时长超过实际时长,将按实际时长截取;若不足则按请求时长截取但不超过实际时长
- 片段音量通过 AudioSegment 的 volume 参数设置,默认1.0
- 片段添加到新建的音频轨道上,轨道相对索引设置为10,避免与主轨道冲突
- 音频效果
- 支持通过 audio_effect 指定效果名称,服务层会查找对应效果类型并转换参数范围(0-100),然后应用到 AudioSegment
- 错误处理
- 草稿URL无效、audio_infos 缺失或格式错误、单条音频必填字段缺失、音量越界、时长非法、添加片段重叠等均会触发相应错误码
flowchart TD
Start(["进入 add_audios"]) --> Parse["解析 audio_infos JSON"]
Parse --> Validate["校验必填字段与范围"]
Validate --> |通过| Download["下载音频文件"]
Validate --> |失败| Err1["抛出参数错误"]
Download --> Detect["检测音频实际时长"]
Detect --> Calc["计算片段时间范围(start/end/duration)"]
Calc --> CreateSeg["创建 AudioSegment(volume/时长)"]
CreateSeg --> Effect{"是否指定效果?"}
Effect --> |是| ApplyEff["查找并应用音频效果"]
Effect --> |否| AddTrack["创建音频轨道"]
ApplyEff --> AddTrack
AddTrack --> AddSeg["添加片段到轨道"]
AddSeg --> Overlap{"是否重叠?"}
Overlap --> |是| Adjust["微调开始时间并重试"]
Overlap --> |否| Save["保存草稿并返回"]
Adjust --> AddSeg
Err1 --> End(["结束"])
Save --> End
/v1/get_audio_duration 接口
- 接口定位
- 获取音频文件时长,返回微秒级时长
- 请求参数
- mp3_url:音频文件URL(支持常见音频格式)
- 响应参数
- duration:音频时长(微秒,>=0)
- 实现要点
- 服务层先下载到临时目录,再调用 get_media_duration(...) 通过 ffprobe 获取时长,最后清理临时文件
- 若检测失败,抛出 AUDIO_DURATION_GET_FAILED 错误
sequenceDiagram
participant Client as "客户端"
participant Router as "路由层(v1)"
participant Schema as "模型层(Pydantic)"
participant Service as "服务层(get_audio_duration)"
participant Utils as "工具(download/get_media_duration)"
Client->>Router : POST /v1/get_audio_duration
Router->>Schema : 校验请求参数
Router->>Service : 调用 get_audio_duration(mp3_url)
Service->>Utils : download(mp3_url, TEMP_DIR)
Utils-->>Service : 本地临时文件路径
Service->>Utils : get_media_duration(path)
Utils-->>Service : 时长(微秒)
Service-->>Router : 返回 duration
Router-->>Client : 200 OK 响应
音频信息数据结构与配置
- audio_infos 数组元素字段
- audio_url:音频文件URL(必填)
- start:开始时间(微秒,必填)
- end:结束时间(微秒,必填)
- duration:音频总时长(微秒,可选;未提供时将自动检测)
- volume:音量(0.0-2.0,可选,默认1.0)
- audio_effect:音频效果名称(可选)
- 时间参数说明
- start/end 以微秒为单位;实际播放时长 = end - start
- 音量控制
- 0.0 表示静音,1.0 表示原始音量,0.5 表示减半音量;范围建议为 0.0-2.0
- 音频效果
- 支持通过名称匹配效果类型,参数会被转换到 0-100 范围后应用
音频轨道与时间线布局
- 轨道创建
- 服务层创建新的音频轨道,名称包含唯一标识,相对渲染索引设置为10,避免与主轨道冲突
- 片段添加与重叠处理
- 片段添加时若发生重叠,服务层会逐步增加开始时间偏移(每次+100微秒),最多尝试若干次,直至不重叠或达到最大尝试次数
- 结束时间与最小持续时间
- 片段持续时间不得为零或负数,若计算为非正值,将设置最小持续时间为100微秒,避免重叠问题
音频效果应用
- 效果查找与参数转换
- 服务层根据效果名称在多种效果类型中查找匹配项,若找到则将默认参数转换为 0-100 范围后应用
- 效果对象
- AudioEffect 与 AudioSegment 配合,支持场景音、音色、声音成曲等分类
音频格式支持、采样率与文件大小
- 格式支持
- 通过 ffprobe 检测时长,理论上支持 ffprobe 能识别的常见音频格式(如 MP3、WAV、M4A 等)
- 采样率与质量
- 代码未对采样率进行显式限制;最终效果取决于底层剪映对素材的处理
- 文件大小
- 服务层会下载到临时目录,大文件可能影响下载与处理性能;建议优先使用较小或压缩后的音频文件
最佳实践
- 音频同步
- 使用统一时间基准(微秒),确保各音频片段的 start/end 与整体时长一致
- 多轨混合
- 将不同类型的音频(背景音乐、音效、旁白)分别放置在独立音频轨道,便于单独调节音量与应用效果
- 音频效果处理
- 优先使用预设效果名称,避免复杂参数配置;如需精细控制,可在支持的前提下通过关键帧实现动态音量变化
- 性能优化
- 预先获取音频时长,减少重复检测;合理规划片段时长,避免过长片段导致重叠与反复调整
依赖关系分析
- 组件耦合
- 路由层仅负责参数绑定与响应封装,业务逻辑集中在服务层
- 服务层依赖工具层(下载与媒体检测)与底层剪映模型(轨道与片段)
- 外部依赖
- ffprobe:用于媒体时长检测
- 剪映草稿模型:用于轨道与片段的创建与管理
- 错误边界
- 所有异常通过自定义异常类与错误码统一返回,便于前端与客户端处理
graph LR
Router["路由层"] --> Service["服务层"]
Service --> Utils["工具层(download/get_media_duration)"]
Service --> Model["剪映草稿模型(AudioSegment/Track)"]
Service --> Config["配置(config.py)"]
Service --> Errors["错误码(exceptions.py)"]
性能考量
- 下载与检测
- 大音频文件会增加下载与 ffprobe 检测耗时;建议在调用前预先获取时长并缓存
- 片段重叠调整
- 当发生重叠时,服务层会多次尝试微调开始时间;尽量避免密集片段叠加,减少重试次数
- 资源清理
- 服务层在获取时长后会清理临时文件,避免磁盘占用;请确保临时目录空间充足
故障排查指南
- 常见错误与解决
- 草稿URL无效:确认 draft_url 中 draft_id 存在于缓存中
- audio_infos 缺失或格式错误:确保为合法JSON字符串数组,且每项包含 audio_url、start、end
- 音量越界:将音量限制在 0.0-2.0
- 时长非法:duration 必须为正数;未提供时将自动检测
- 片段重叠:检查 start/end 是否与其他片段冲突;必要时微调时间
- 音频资源不可访问:确认 audio_url 可正常访问
- 错误码参考
- 2007:无效的音频信息
- 2008:音频添加失败
- 2034:获取音频时长失败
- 1002:资源不存在
- 9998:系统内部错误
结论
/v1/add_audios 与 /v1/get_audio_duration 为音频处理的核心能力,前者负责批量添加与轨道管理,后者负责时长检测。通过明确的参数规范、完善的错误处理与合理的重叠处理策略,可稳定地实现多轨音频混合与效果应用。
建议结合最佳实践,提前规划时间线与效果,以获得更优的处理性能与产出质量。
附录
接口清单与使用要点
- /v1/add_audios
- 请求:draft_url、audio_infos(JSON字符串数组)
- 响应:draft_url、track_id、audio_ids
- 适用场景:批量添加背景音乐、音效、旁白等
- /v1/get_audio_duration
- 请求:mp3_url
- 响应:duration(微秒)
- 适用场景:预估时长、统一时间基准
测试参考
- 手动测试脚本
- /v1/add_audios:创建草稿后调用添加音频,断言返回的 track_id 与 audio_ids
- /v1/get_audio_duration:发送请求并验证响应包含 duration 字段