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.
| Option | What it costs you | Verdict |
|---|---|---|
| Empaquetar ffmpeg dentro de tu función de Cloudflare Workers | Los Workers no pueden correr binarios nativos en absoluto | |
| Alojar tú mismo un contenedor o VM | Costo permanente más parches, escalado y monitoreo | |
| Correr una cola de trabajos + worker | Infraestructura 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 Fotovid | Un solo request HTTPS; nada que correr, empaquetar ni escalar |
Tu primera llamada en tres pasos
- 1Consigue 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.
- 2Enví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.
- 3Usa 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.
