¿Por qué ffmpeg no puede correr en Deno Deploy? Sin subprocess, así que llama a la API.
Deno Deploy ejecuta tu código en isolates de V8 sin subprocess ni FFI, así que el binario de ffmpeg no puede arrancar. Llama a Fotovid con fetch() en su lugar: ejecuta la codificación en otro sitio y responde con un enlace https directo al archivo.
Deno.serve(async (req) => {
const { videoUrl, logoUrl } = await req.json();
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${Deno.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 });
});El modelo de isolates no deja correr ffmpeg, y punto.
Deno Deploy está construido sobre isolates de V8 pensados para lógica rápida en el edge, no para codificación de video con alto consumo de CPU. No hay API de subprocess para lanzar un binario nativo ni FFI para cargar uno, así que el proceso de ffmpeg nunca llega a iniciarse. Esto no es una opción de configuración ni un permiso que puedas conceder: los mecanismos que ffmpeg necesita simplemente no existen dentro del sandbox del isolate. Existen versiones de ffmpeg compiladas a WebAssembly, pero superan con creces los límites de CPU y memoria del isolate con cualquier video real, y no pueden transmitir un archivo grande en streaming.
- Sin subprocess: Deno.Command y child_process no pueden lanzar el binario de ffmpeg dentro de un isolate.
- Sin FFI: no puedes hacer dlopen de una librería nativa de ffmpeg ni llamarla directamente.
- El ffmpeg en Wasm agota la CPU y la memoria del isolate con videos reales y no puede transmitir entradas grandes en streaming.
- La plataforma está optimizada para peticiones cortas en el edge, no para trabajos de codificación de varios segundos.
Formas en que los equipos intentan correr ffmpeg en Deno Deploy
Antes de Fotovid, estas eran las opciones. Cada una es trabajo que preferirías no asumir.
| Option | What it costs you | Verdict |
|---|---|---|
| Incluir ffmpeg en tu función de Deno Deploy | No hay subprocess para lanzar el binario de ffmpeg | |
| Autoalojar un contenedor o VM | Costo permanente más parches, escalado y monitoreo | |
| Montar 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 dispositivos móviles | |
| Llamar a la API de Fotovid | Una petición HTTPS; nada que correr, empaquetar ni escalar |
Tu primera llamada en tres pasos
- 1Consigue una API key gratis
Regístrate y crea una key: no necesitas tarjeta para empezar. Obtienes un key ID y un secret que se combinan en un Bearer token con el formato p6_<key_id>:<secret>. Guárdalo en una variable de entorno de Deno Deploy para que tu isolate se autentique sin necesidad de distribuir ningún binario.
- 2Haz un POST al endpoint de marca de agua
Desde tu handler de Deno, haz un fetch normal con POST a https://api.fotovid.co/v1/video/watermark con tu Bearer token. Envía el envelope estándar: un source_url que apunte a la URL HTTPS de tu video de entrada, más un objeto params que describa la marca de agua: type (image, text o combo), el watermark_image_url o text, position como bottom-right, opacity y scale. Fotovid descarga la fuente, ejecuta ffmpeg en su propia infraestructura y responde antes de que tu isolate llegue al timeout.
- 3Usa la URL devuelta
La respuesta es JSON plano: un id, un type y una url que apunta al video terminado y alojado por Fotovid, más expires_at y duration. Pasa esa url directamente a tu cliente, o descárgala desde tu servidor y guarda tu propia copia en el bucket que ya uses. La mayoría de las operaciones cuestan 1 credit, así que una llamada de marca de agua es un solo credit contra tu saldo.
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.
