ffmpeg en Cloudflare Workers

Corre ffmpeg en Cloudflare Workers llamándolo, no empaquetándolo.

Los Workers corren en un V8 isolate — sin filesystem, sin binarios nativos, con límites estrictos de CPU. Tu Worker le pasa a Fotovid una URL por HTTPS; la codificación corre fuera del isolate y vuelve como un enlace alojado, así que nunca cuenta contra tu presupuesto de CPU.

export default {
  async fetch(req: Request, env: { FOTOVID_API_KEY: string }): Promise<Response> {
    const { videoUrl, logoUrl } = await req.json();

    const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${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 Response.json({ url });
  },
};

Por qué tu Worker se ahoga con ffmpeg

Cloudflare Workers no corren en un contenedor — corren dentro de un V8 isolate. No hay filesystem donde escribir archivos temporales, no hay forma de invocar un binario nativo, y hay límites estrictos de tiempo de CPU por request. El binario de ffmpeg simplemente no puede existir ahí. La build en WASM técnicamente carga, pero queda limitada por el presupuesto de memoria y CPU del isolate y falla con cualquier cosa que pase de un clip trivial. Una API alojada es el único camino realista.

  • Sin filesystem: ffmpeg necesita archivos temporales para leer la entrada y escribir la salida — los Workers no te dan ninguno.
  • Sin binarios nativos: no puedes instalar ni ejecutar el binario de ffmpeg en un V8 isolate.
  • ffmpeg en WASM carga pero queda limitado por la memoria y CPU del isolate — se estanca o agota el tiempo con video real.
  • El presupuesto estricto de CPU por request hace que cualquier trabajo del tamaño de una transcodificación sea inviable.

Formas en que los equipos intentan correr ffmpeg en Cloudflare Workers

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 función de Cloudflare WorkersLos Workers no pueden correr binarios nativos en absoluto
Alojar tú mismo un contenedor o VMCosto permanente más parches, escalado y monitoreo
Correr una cola de trabajos + workerInfraestructura nueva: una cola, workers, reintentos, manejo de dead-letter
Transcodificar en el navegador (WASM)Lento, consume mucha memoria y falla en móvil
Llamar a la API de FotovidUn solo request HTTPS; nada que correr, empaquetar ni escalar
How it works

Tu primera llamada en tres pasos

  1. 1
    Consigue una API key gratis

    Regístrate y crea una key. Obtendrás un token Authorization: Bearer p6_<key_id>:<secret> que autentica cada llamada a https://api.fotovid.co. Sin infraestructura, sin compilar ffmpeg — solo un header.

  2. 2
    Envía tu video con POST desde el Worker

    Llama a POST /v1/video/watermark con el sobre estándar: un source_url que apunte a la URL HTTPS de tu video de entrada, y un objeto params — define type como image, text o combo, además de position (por ejemplo, bottom-right), opacity y scale. Es un fetch simple desde dentro de tu Worker, así que encaja perfectamente con el modelo de request del isolate.

  3. 3
    Usa la URL del resultado alojado

    Fotovid devuelve un JSON plano: { id, type, url, expires_at, duration }. La url apunta a tu video terminado y con la marca de agua, alojado en Fotovid. Pásasela directo a tu cliente, o cópiala a tu propio bucket para conservar una copia permanente — el resultado alojado es temporal.

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.