本方案提供从架构设计、代码实现、部署上线到 AI 平台对接的端到端落地指南,可直接用于生产环境。
🔹 一、整体架构设计
采用分层解耦架构,确保高可扩展性和稳定性:
层级
作用
技术选型
用户交互层
自然语言指令输入/结果输出
豆包/其他 AI 助手平台
AI 平台层
意图识别、参数解析、请求转发
豆包开放平台、GPTs 配置
Skill 服务层
指令调度、任务管理、结果封装
Python + FastAPI、云函数
FFmpeg 执行层
音视频处理命令执行
FFmpeg 二进制、subprocess
存储层
输入/输出文件存储
阿里云 OSS、AWS S3
监控层
日志收集、错误告警
阿里云日志服务、Prometheus
🔹 二、环境准备
2.1 云服务选型
推荐使用 阿里云函数计算(国内访问更优)或 AWS Lambda(全球覆盖),以下以阿里云为例:
- 1. 创建函数计算服务,选择
Python 3.10运行时。 - 2. 创建 层(Layer) 并上传预编译的 FFmpeg 二进制文件(支持 ARM/x86 架构),避免每次部署重复安装。
- 3. 绑定对象存储 OSS 用于文件存储,配置跨域访问(CORS)。
2.2 本地开发环境
# 安装依赖
pip install fastapi uvicorn python-multipart oss2 loguru
# 安装 FFmpeg(本地调试用)
# macOS: brew install ffmpeg
# Ubuntu: sudo apt install ffmpeg
🔹 三、核心服务代码实现
3.1 完整 FastAPI 服务代码
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import JSONResponse
import subprocess
import os
import uuid
import oss2
from loguru import logger
from typing import Optional
# 初始化 FastAPI
app = FastAPI(title="FFmpeg Skill Service", version="1.0")
# OSS 配置(替换为你的实际信息)
OSS_ACCESS_KEY_ID = "your_access_key"
OSS_ACCESS_KEY_SECRET = "your_secret_key"
OSS_ENDPOINT = "oss-cn-hangzhou.aliyuncs.com"
OSS_BUCKET = "your-bucket-name"
bucket = oss2.Bucket(oss2.Auth(OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET), OSS_ENDPOINT, OSS_BUCKET)
# FFmpeg 路径(云函数层中已预装)
FFMPEG_PATH = "/opt/ffmpeg" if os.path.exists("/opt/ffmpeg") else "ffmpeg"
def generate_unique_filename(original_name: str) -> str:
"""生成唯一文件名,避免冲突"""
ext = os.path.splitext(original_name)[1]
return f"{uuid.uuid4().hex}{ext}"
def run_ffmpeg_command(cmd: list) -> str:
"""执行 FFmpeg 命令并返回输出"""
try:
result = subprocess.run(
cmd,
check=True,
capture_output=True,
text=True
)
logger.info(f"FFmpeg 执行成功: {' '.join(cmd)}")
return result.stdout
except subprocess.CalledProcessError as e:
logger.error(f"FFmpeg 执行失败: {e.stderr}")
raise HTTPException(status_code=500, detail=f"处理失败: {e.stderr}")
@app.post("/api/convert-format")
async def convert_format(
file: UploadFile = File(...),
output_format: str = "mp4"
):
# 1. 上传文件到 OSS
input_filename = generate_unique_filename(file.filename)
bucket.put_object(input_filename, await file.read())
input_oss_url = f"https://{OSS_BUCKET}.{OSS_ENDPOINT}/{input_filename}"
# 2. 生成输出文件名
output_filename = f"{os.path.splitext(input_filename)[0]}.{output_format}"
local_output = f"/tmp/{output_filename}"
# 3. 执行 FFmpeg 转换
cmd = [
FFMPEG_PATH,
"-i", input_oss_url,
"-c:v", "libx264",
"-c:a", "aac",
local_output
]
run_ffmpeg_command(cmd)
# 4. 上传结果到 OSS
bucket.put_object_from_file(output_filename, local_output)
output_oss_url = f"https://{OSS_BUCKET}.{OSS_ENDPOINT}/{output_filename}"
# 5. 清理本地临时文件
os.remove(local_output)
return JSONResponse(content={
"status": "success",
"input_url": input_oss_url,
"output_url": output_oss_url,
"format": output_format
})
@app.post("/api/resize-resolution")
async def resize_resolution(
file: UploadFile = File(...),
width: int = 1920,
height: int = 1080
):
# 同转换流程,仅 FFmpeg 命令不同
input_filename = generate_unique_filename(file.filename)
bucket.put_object(input_filename, await file.read())
input_oss_url = f"https://{OSS_BUCKET}.{OSS_ENDPOINT}/{input_filename}"
output_filename = f"{os.path.splitext(input_filename)[0]}_{width}x{height}.mp4"
local_output = f"/tmp/{output_filename}"
cmd = [
FFMPEG_PATH,
"-i", input_oss_url,
"-s", f"{width}x{height}",
"-c:v", "libx264",
"-c:a", "aac",
local_output
]
run_ffmpeg_command(cmd)
bucket.put_object_from_file(output_filename, local_output)
output_oss_url = f"https://{OSS_BUCKET}.{OSS_ENDPOINT}/{output_filename}"
os.remove(local_output)
return JSONResponse(content={
"status": "success",
"input_url": input_oss_url,
"output_url": output_oss_url,
"resolution": f"{width}x{height}"
})
# 更多功能接口(压缩、提取音频等)可按相同模式扩展
🔹 四、AI 平台对接(以豆包为例)
4.1 技能配置
-
1. 登录 豆包开放平台,创建新技能。
-
2. 意图配置:
意图名称
触发词
参数映射
格式转换
转成MP4、格式转换、改成MOV
output_format(从用户指令提取)分辨率调整
改成1080P、调整分辨率、720P
width/height(映射为具体数值) -
3. 后端配置:
- • 填写云函数的公网访问地址(如
https://xxx.cn-hangzhou.fcapp.run/api/convert-format)。 - • 配置 API Key 验证,确保仅豆包平台可调用。
- • 填写云函数的公网访问地址(如
4.2 指令流转逻辑
- 1. 用户发送自然语言指令:“帮我把这个视频转成 MOV 格式”。
- 2. 豆包平台识别意图为“格式转换”,提取参数
output_format="mov"。 - 3. 平台调用你的 Skill 服务接口,携带用户上传的视频文件和参数。
- 4. 服务执行 FFmpeg 转换后,返回结果 URL 给豆包。
- 5. 豆包用自然语言反馈给用户:“已帮你将视频转换为 MOV 格式,下载链接:xxx”。
🔹 五、部署与测试
5.1 云函数部署
- 1. 将代码打包为
zip文件,上传到阿里云函数计算。 - 2. 配置层(Layer)包含 FFmpeg 二进制文件,关联到函数。
- 3. 配置环境变量(OSS 密钥、日志级别等)。
- 4. 触发方式选择 HTTP 触发器,生成公网访问地址。
5.2 测试方案
测试类型
测试用例
预期结果
功能测试
上传 MP4 文件,请求转成 MOV
输出 MOV 文件可正常播放
性能测试
上传 1GB 视频文件,测试转换耗时
耗时 < 5 分钟(根据配置调整)
异常测试
上传非视频文件、无效分辨率
返回友好错误提示,服务不崩溃
🔹 六、运维与优化
- 1. 日志监控:通过阿里云日志服务收集函数日志,配置错误告警。
- 2. 资源优化:根据视频处理耗时调整云函数内存配置(建议 2GB+)。
- 3. 异步处理:对大文件任务引入消息队列(如 RocketMQ),实现异步回调。
- 4. 缓存策略:对重复转换任务缓存结果,减少计算资源浪费。