ffmpeg en Netlify Functions: demasiado grande para empaquetar, así que lo alojamos por ti.
Las Netlify Functions se ejecutan sobre AWS Lambda, así que ffmpeg supera el límite de tamaño del paquete y el timeout por defecto. Delega el trabajo a Fotovid: envías una petición y recibes de vuelta una URL de resultado lista, muy por debajo de cualquier timeout.
// netlify/functions/watermark.mts
export default async (req: Request) => {
const { videoUrl, logoUrl } = await req.json();
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${Netlify.env.get("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 Response.json({ url });
};Por qué ffmpeg en Netlify sigue fallando
Las Netlify Functions se ejecutan sobre AWS Lambda, y ahí es exactamente donde ffmpeg choca con sus límites. Un binario estático de ffmpeg es demasiado grande para el límite de paquete de ~50MB comprimidos / 250MB descomprimidos, así que el despliegue falla o el binario simplemente no llega a subirse. Incluso si consigues encajarlo, el timeout por defecto de 10s de la función mata cualquier transcodificación real: las background functions te dan 26s, que siguen sin ser suficientes para la mayoría de trabajos de video. Es la clásica trampa de 'funciona en mi portátil, expira en producción'.
- El binario de ffmpeg + sus librerías superan el límite de paquete de Lambda de 250MB descomprimidos
- El timeout por defecto de 10s (26s en background) mata las transcodificaciones reales a mitad de proceso
- Los cold starts y la gestión de layers añaden latencia y dolores de empaquetado
- El éxito en local no se reproduce en la función desplegada
Formas en que los equipos intentan ejecutar ffmpeg en Netlify
Antes de Fotovid estas eran las opciones — cada una es trabajo que preferirías no tener que asumir.
| Option | What it costs you | Verdict |
|---|---|---|
| Empaquetar ffmpeg dentro de tu Netlify Function | Supera el paquete de 250MB y alcanza el timeout de 10s de la función | |
| Autoalojar un contenedor o VM | Coste continuo más parcheo, escalado y monitoreo | |
| Montar una cola de trabajos + workers | Infraestructura nueva: una cola, workers, reintentos, gestión de dead-letter | |
| Transcodificar en el navegador (WASM) | Lento, consume mucha memoria y falla en móvil | |
| Llamar a la API de Fotovid | Una petición HTTPS; nada que ejecutar, empaquetar ni escalar |
Tu primera llamada en tres pasos
- 1Consigue una API key gratuita
Regístrate y crea una key. Te autenticas con una cabecera Authorization: Bearer p6_<key_id>:<secret> — sin binarios, sin Lambda layers, nada que empaquetar dentro de tu Netlify Function.
- 2Envía tu video con POST al endpoint de watermark
Desde dentro de tu Netlify Function, llama a POST /v1/video/watermark en https://api.fotovid.co. Envía el sobre estándar: una source_url que apunte a tu video de entrada más un objeto params — define type como image, text o combo, luego elige una posición como bottom-right, además de opacity, scale y padding. Fotovid hace el trabajo de ffmpeg fuera de tu plataforma, así que tu función solo hace una petición HTTPS rápida en lugar de invocar un binario que no puede desplegar.
- 3Usa la URL de resultado alojada
La respuesta es un JSON plano con id, type, url y expires_at. La url apunta al video terminado, alojado por Fotovid. Devuélvela a tu cliente o guarda tu propia copia — como los resultados se alojan temporalmente, descarga y vuelve a persistir el archivo donde guardes tus assets.
Preguntas frecuentes
Lánzalo con una sola llamada a la API
Consigue una key gratis y haz tu primera llamada en menos de cinco minutos.
