ffmpeg trên AWS Lambda

ffmpeg trên AWS Lambda mà không cần tự quản Lambda

Lambda chạy được ffmpeg — nhưng bạn phải gánh cả việc đóng gói, cold start lẫn vận hành. Fotovid gỡ bỏ cả ba việc đó khỏi vai bạn: gửi một request, nhận một file đã host, bỏ qua bước build 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 }) };
};

Bạn chỉ muốn gắn watermark cho một file upload

Đúng, Lambda chạy được ffmpeg. Bạn build một layer dưới giới hạn 250MB sau khi giải nén, cấu hình /tmp làm vùng scratch (tối đa 10GB), và giữ trong giới hạn 15 phút. Rồi việc thực sự mới bắt đầu: ghim một bản build ffmpeg tĩnh, tinh chỉnh memory để một lần encode 1080p không bị timeout, chịu cold start ở request đầu tiên, và tự quản lý toàn bộ mãi mãi. Đó là rất nhiều hạ tầng phải dựng lên chỉ để dán một logo lên video.

  • Đóng gói và quản lý phiên bản một binary ffmpeg tĩnh dưới dạng layer, dưới giới hạn 250MB sau khi giải nén
  • Tinh chỉnh memory và timeout cho từng thao tác để encode không thất bại khi chạm mốc 15 phút
  • Hứng chịu độ trễ cold-start ngay trên request mà người dùng đang chờ
  • Bảo trì, vá lỗi và giám sát một Lambda chạy ffmpeg mà bạn chưa từng muốn sở hữu

Các cách team thường thử để chạy ffmpeg trên AWS Lambda

Trước khi có Fotovid, đây là các lựa chọn — mỗi cách đều là việc bạn không muốn tự ôm.

OptionWhat it costs youVerdict
Đóng gói ffmpeg vào hàm AWS Lambda của bạnChỉ vừa đủ lọt qua nhờ một layer bạn tự đóng gói, tự chịu cold-start và tự tinh chỉnh
Tự host một container hoặc VMChi phí chạy liên tục cộng thêm vá lỗi, mở rộng và giám sát
Chạy một job queue kèm workerHạ tầng mới: một queue, các worker, cơ chế retry, xử lý dead-letter
Transcode ngay trong trình duyệt (WASM)Chậm, ngốn memory, và crash trên mobile
Gọi Fotovid APIMột request HTTPS; không phải chạy, đóng gói hay mở rộng gì cả
How it works

Lệnh gọi đầu tiên của bạn trong ba bước

  1. 1
    Lấy một API key miễn phí

    Tạo một key Fotovid để nhận token theo dạng p6_<key_id>:<secret>. Gửi nó dưới dạng header Authorization: Bearer trong mọi request. Không cần AWS role, không cần layer, không cần build pipeline — mức dùng tính theo credits ($1 = 100 credits, hầu hết thao tác tốn 1 credit).

  2. 2
    POST video của bạn tới /v1/video/watermark

    Gọi POST https://api.fotovid.co/v1/video/watermark với envelope chuẩn: một source_url trỏ tới input của bạn qua HTTPS, cùng một object params. Với watermark, đặt type (image, text, hoặc combo), watermark_image_url hoặc text, một position như bottom-right, và tùy chọn opacity, scale, padding. Fotovid tải source, chạy ffmpeg, và trả về đồng bộ — không cần poll queue, không cần giữ Lambda luôn ấm.

  3. 3
    Dùng URL kết quả đã host

    Phản hồi là JSON phẳng: một id, type, và một url trỏ tới file hoàn chỉnh do Fotovid host (cộng thêm expires_at, và với video là duration). Đưa thẳng URL đó cho frontend của bạn hoặc tải về để lưu bản riêng. Cùng một luồng áp dụng cho /v1/video/trim, /v1/video/extract-audio, /v1/video/extract-cover, /v1/video/probe, và các endpoint image, audio.

Câu hỏi thường gặp

Triển khai chỉ với một lệnh gọi API

Lấy một key miễn phí và thực hiện lệnh gọi đầu tiên trong chưa đầy năm phút.