在 AWS Lambda 上跑 ffmpeg,但不用自己养这台 Lambda
Lambda 确实能跑 ffmpeg——代价是打包、冷启动和运维全归你。Fotovid 把这三件事一并接走:发个请求,拿回托管好的文件,Layer 构建这一步直接省掉。
// handler.mjs — Node 18+ runtime (global fetch)
export const handler = async (event) => {
const { videoUrl, logoUrl } = JSON.parse(event.body);
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FOTOVID_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
source_url: videoUrl,
params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
}),
});
const { url } = await res.json();
return { statusCode: 200, body: JSON.stringify({ url }) };
};你只是想给用户上传的视频打个水印
没错,Lambda 能跑 ffmpeg。你需要构建一个 Layer 并压在 250MB 解压体积上限内,用 /tmp 做临时工作目录(最多 10GB),还要把任务控制在 15 分钟上限以内。真正的麻烦从这里才开始:锁定一个静态编译的 ffmpeg 版本,反复调内存好让 1080p 转码不至于超时,在第一个请求上硬扛冷启动,然后长期背着这一整套。就为了给视频盖一个 logo,要立起来的基础设施实在太多了。
- 把静态 ffmpeg 二进制打成 Layer 并做版本管理,还得压在 250MB 解压体积上限内
- 为每种操作单独调内存和超时,免得转码撞上 15 分钟那堵墙
- 冷启动的延迟恰好落在用户正等着的那个请求上,只能自己吞下
- 维护、打补丁、做监控——为了一个你压根不想要的 ffmpeg Lambda
团队在 AWS Lambda 上跑 ffmpeg 的几条路
在 Fotovid 之前,你只有这些选项——每一条都是你并不想接手的活儿。
| Option | What it costs you | Verdict |
|---|---|---|
| 把 ffmpeg 打进你的 AWS Lambda 函数 | 只有做成 Layer 才塞得下,打包、冷启动、调优全靠自己 | |
| 自建容器或虚拟机 | 常驻开销,外加打补丁、扩缩容和监控 | |
| 搭一套任务队列 + worker | 又多一套基础设施:队列、worker、重试、死信处理 | |
| 在浏览器里转码(WASM) | 又慢又吃内存,手机上直接崩 | |
| 调用 Fotovid API | 一次 HTTPS 请求;没有东西要跑、要打包、要扩容 |
三步完成第一次调用
- 1免费获取 API 密钥
在 Fotovid 创建一个密钥,你会拿到形如 p6_<key_id>:<secret> 的 token。每个请求用 Authorization: Bearer 请求头带上它即可。不用配 AWS 角色,不用打 Layer,也不用搭构建流水线——用量按 credits 计费($1 = 100 credits,大多数操作每次 1 credit)。
- 2把视频 POST 到 /v1/video/watermark
调用 POST https://api.fotovid.co/v1/video/watermark,请求体用统一的信封结构:source_url 通过 HTTPS 指向你的输入文件,再加上一个 params 对象。做水印时设置 type(image、text 或 combo)、watermark_image_url 或 text、类似 bottom-right 的 position,以及可选的 opacity、scale 和 padding。Fotovid 会拉取源文件、跑 ffmpeg,然后同步返回——没有队列要轮询,也没有 Lambda 需要保温。
- 3使用托管的结果 URL
响应是扁平 JSON:包含 id、type,以及指向成品文件的 url(文件由 Fotovid 托管),另有 expires_at,视频还会带 duration。你可以把这个 URL 直接丢给前端,也可以下载下来在自己那边存一份。/v1/video/trim、/v1/video/extract-audio、/v1/video/extract-cover、/v1/video/probe 以及图片和音频相关端点,流程完全一样。
