AWS Lambda 上的 ffmpeg

在 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 之前,你只有这些选项——每一条都是你并不想接手的活儿。

OptionWhat it costs youVerdict
把 ffmpeg 打进你的 AWS Lambda 函数只有做成 Layer 才塞得下,打包、冷启动、调优全靠自己
自建容器或虚拟机常驻开销,外加打补丁、扩缩容和监控
搭一套任务队列 + worker又多一套基础设施:队列、worker、重试、死信处理
在浏览器里转码(WASM)又慢又吃内存,手机上直接崩
调用 Fotovid API一次 HTTPS 请求;没有东西要跑、要打包、要扩容
How it works

三步完成第一次调用

  1. 1
    免费获取 API 密钥

    在 Fotovid 创建一个密钥,你会拿到形如 p6_<key_id>:<secret> 的 token。每个请求用 Authorization: Bearer 请求头带上它即可。不用配 AWS 角色,不用打 Layer,也不用搭构建流水线——用量按 credits 计费($1 = 100 credits,大多数操作每次 1 credit)。

  2. 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. 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 以及图片和音频相关端点,流程完全一样。

常见问题

一次 API 调用即可上线

领一个免费密钥,五分钟内完成你的第一次调用。