Perché ffmpeg non può girare su Deno Deploy? Niente sottoprocessi — quindi chiama l'API.
Deno Deploy esegue il tuo codice in isolate V8 senza sottoprocessi e senza FFI, quindi il binario ffmpeg non può essere avviato. Chiama invece Fotovid tramite fetch() — l'encoding gira altrove e ricevi come risposta un semplice link https al file.
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 });
});Il modello a isolate non permette a ffmpeg di girare — punto e basta
Deno Deploy si basa su isolate V8 pensati per una logica edge veloce, non per l'encoding media ad alto uso di CPU. Non c'è un'API per i sottoprocessi con cui avviare un binario nativo, né un FFI per caricarne uno, quindi il processo ffmpeg non parte mai. Non è un flag di configurazione o un permesso che puoi concedere — le primitive di cui ffmpeg ha bisogno semplicemente non esistono nella sandbox dell'isolate. Esistono porting WebAssembly di ffmpeg, ma superano i limiti di CPU e memoria dell'isolate su qualsiasi video reale e non riescono a far transitare in streaming un file di grandi dimensioni.
- Niente sottoprocessi: Deno.Command e child_process non possono avviare il binario ffmpeg all'interno di un isolate.
- Niente FFI: non puoi fare dlopen su una libreria ffmpeg nativa e chiamarla direttamente.
- ffmpeg in Wasm esaurisce CPU/memoria dell'isolate su video reali e non riesce a far transitare in streaming input di grandi dimensioni.
- La piattaforma è calibrata per richieste edge brevi, non per job di encoding di più secondi.
Come i team provano a far girare ffmpeg su Deno Deploy
Prima di Fotovid erano queste le opzioni — e ognuna è un lavoro che preferiresti non avere.
| Option | What it costs you | Verdict |
|---|---|---|
| Includere ffmpeg nella tua funzione Deno Deploy | Nessun sottoprocesso per avviare il binario ffmpeg | |
| Fare self-hosting su container o VM | Costo always-on più patching, scaling e monitoring | |
| Gestire una coda di job + worker | Nuova infrastruttura: una coda, worker, retry, gestione dead-letter | |
| Transcodifica nel browser (WASM) | Lenta, avida di memoria, e va in crash su mobile | |
| Chiamare l'API Fotovid | Una richiesta HTTPS; niente da eseguire, pacchettizzare o scalare |
La tua prima chiamata in tre passaggi
- 1Ottieni una API key gratuita
Registrati e crea una key — nessuna carta richiesta per iniziare. Ottieni un key ID e un secret che si combinano in un token Bearer nella forma p6_<key_id>:<secret>. Salvalo in una variabile d'ambiente di Deno Deploy così il tuo isolate può autenticarsi senza dover includere alcun binario.
- 2Fai una POST all'endpoint watermark
Dal tuo handler Deno, esegui una normale fetch in POST verso https://api.fotovid.co/v1/video/watermark con il tuo token Bearer. Invia la busta standard: un source_url che punta all'URL HTTPS del tuo video di input, più un oggetto params che descrive il watermark — type (image, text o combo), il watermark_image_url o text, la position come bottom-right, l'opacity e lo scale. Fotovid recupera la sorgente, esegue ffmpeg sulla propria infrastruttura e risponde prima che il tuo isolate vada in timeout.
- 3Usa l'URL restituito
La risposta è JSON piatto: un id, un type e una url che punta al video finito, ospitato da Fotovid, più expires_at e duration. Passa direttamente quella url al tuo client, oppure recuperala lato server e conserva una tua copia nel bucket che già usi. La maggior parte delle operazioni costa 1 credit, quindi una chiamata watermark addebita un solo credit sul tuo saldo.
Domande frequenti
Rilascialo con una sola chiamata API
Prendi una chiave gratuita e fai la tua prima chiamata in meno di cinque minuti.
