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.
| Option | What it costs you | Verdict |
|---|---|---|
| Đóng gói ffmpeg vào hàm AWS Lambda của bạn | Chỉ 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 VM | Chi 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 worker | Hạ 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 API | Một request HTTPS; không phải chạy, đóng gói hay mở rộng gì cả |
Lệnh gọi đầu tiên của bạn trong ba bước
- 1Lấ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).
- 2POST 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.
- 3Dù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.
