ffmpeg en Netlify Functions

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.

OptionWhat it costs youVerdict
Empaquetar ffmpeg dentro de tu Netlify FunctionSupera el paquete de 250MB y alcanza el timeout de 10s de la función
Autoalojar un contenedor o VMCoste continuo más parcheo, escalado y monitoreo
Montar una cola de trabajos + workersInfraestructura 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 FotovidUna petición HTTPS; nada que ejecutar, empaquetar ni escalar
How it works

Tu primera llamada en tres pasos

  1. 1
    Consigue 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.

  2. 2
    Enví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.

  3. 3
    Usa 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.