把音视频处理能力封装成 HTTP API
如果你想把 FFmpeg 包成一个可调用服务,ffmpeg-service 是一个上手很快的选择。
这篇文章只回答三件事:
- 它能做什么。
- 怎么最快跑起来。
- 哪些参数最值得先调。
项目定位
ffmpeg-service 采用 Flask + FFmpeg,提供 HTTP 接口来处理音视频,核心能力有:
- 媒体信息提取(
/info) - 转码与分辨率调整(
/process) - 视频截图(
/process) - 从视频提取音轨(
/process) - 处理结果下载(
/download/{filename})
镜像支持 linux/amd64、linux/arm64、linux/arm/v7,对树莓派、NAS、x86 都比较友好。
快速启动
直接运行 Docker
1 | docker run -d --name ffmpeg-service --restart on-failure \ |
使用 docker-compose(推荐)
1 | version: "3.8" |
说明:
API_KEYS留空时不鉴权,建议至少配一个 key。TEMP_DIR挂载到宿主机目录后,排错和容量管理都更方便。- 所有行为都能通过环境变量调整,不需要改代码。
核心接口
健康检查
1 | GET /health |
提取媒体信息
1 | POST /info |
支持 media_url(JSON)或文件上传(multipart/form-data)。
媒体处理(主入口)
1 | POST /process |
常见组合:
extract_info=true:提取媒体元信息take_screenshots=true+screenshot_count=5:自动取样截图convert_format=mp4+convert_resolution=720p:视频转码extract_audio=true+audio_format=mp3:提取音轨
一个请求里可以组合多个操作,适合“一次上传,多种输出”。
鉴权与安全
当 API_KEYS 有值时,/process 和 /info 需要请求头:
1 | X-API-Key: your_secret_key |
状态码:
401:缺少 API Key403:API Key 非法413:文件超限(默认 500MB)
建议:
- 打开 API Key。
- 在反向代理层加限流和来源控制。
- 只保留你需要的输入/输出格式。
参数与调优建议
优先关注这些参数:
MAX_FILE_SIZE:上传大小上限FILE_RETENTION_HOURS:结果文件保留时长CLEANUP_INTERVAL_MINUTES:清理任务间隔GUNICORN_WORKERS:并发 worker 数GUNICORN_TIMEOUT:大文件处理超时
简单经验:
- CPU 密集型转码优先
syncworker。 - 大文件场景把
GUNICORN_TIMEOUT调到 120~300 秒。 GUNICORN_MAX_REQUESTS+JITTER可以平滑重启,减少内存抖动。
常见处理流参考
场景一:视频转码 + 抽帧
- 调
/process - 设置
convert_format、convert_resolution - 同时启用
take_screenshots - 从返回的
url下载结果
场景二:视频提取音频
- 调
/process - 设置
extract_audio=true - 指定
audio_format(如mp3、opus)
场景三:仅做媒体探测
- 调
/info - 读取时长、编码、分辨率、码率
- 再决定是否转码
总结
ffmpeg-service 的优点是:部署快、接口直观、配置项齐全。
建议先用最小配置跑通,再根据文件大小和并发量逐步调 MAX_FILE_SIZE、GUNICORN_TIMEOUT、GUNICORN_WORKERS。

