ffmpeg su Supabase Edge Functions, delegato a una singola chiamata HTTPS.
Le Edge Functions girano su Deno, quindi non c'è nessun child_process per lanciare il binario ffmpeg. Mantieni la tua funzione, delega l'encoding a una chiamata HTTPS e ricevi l'URL del file finito.
// supabase/functions/watermark/index.ts
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, // a Supabase Storage signed URL works here
params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
}),
});
const { url } = await res.json();
return Response.json({ url });
});Perché ffmpeg non gira nella tua Edge Function
Le Supabase Edge Functions vengono eseguite sul runtime Deno, che non ha un'API child_process o subprocess — quindi non c'è nulla con cui lanciare il binario ffmpeg, anche se lo includi nel bundle. In più, i limiti di CPU e di tempo di esecuzione sono pensati per logica di richiesta leggera, non per il lavoro sostenuto di secondi o minuti richiesto dall'encoding multimediale. Un trigger Storage è perfetto per *avviare* un job nel momento in cui arriva un file, ma il transcoding vero e proprio deve avvenire dove può girare un encoder reale.
- Nessun child_process / subprocess su Deno — non puoi eseguire il binario ffmpeg
- I limiti di CPU e tempo di esecuzione sono pensati per logica rapida, non per l'encoding multimediale
- I trigger Storage sono ideali per avviare un job, ma il lavoro deve girare altrove
- Build statiche di ffmpeg, WASM e layer vanno tutti a sbattere contro il runtime, non solo contro la dimensione
Come i team provano a far girare ffmpeg su Supabase
Prima di Fotovid queste erano le opzioni — ognuna è lavoro che preferiresti non doverti accollare.
| Option | What it costs you | Verdict |
|---|---|---|
| Includere ffmpeg nella tua funzione Supabase | Deno non ha child_process — non puoi lanciare il binario | |
| Ospitare tu stesso un container o una VM | Costo always-on più patching, scaling e monitoring | |
| Gestire una coda di job + worker | Nuova infrastruttura: una coda, worker, retry, gestione dead-letter | |
| Fare transcoding nel browser (WASM) | Lento, avido di memoria e va in crash su mobile | |
| Chiamare l'API Fotovid | Una richiesta HTTPS; niente da eseguire, impacchettare o scalare |
La tua prima chiamata in tre passi
- 1Ottieni un'API key gratuita
Registrati e crea una key. Fotovid funziona a crediti d'uso — $1 = 100 credits e la maggior parte delle operazioni costa 1 credit — così puoi configurare la chiamata principale per il watermark e testarla end to end prima di spendere qualcosa.
- 2Chiama l'endpoint watermark dalla tua funzione
Dall'interno della stessa Edge Function (o dal trigger Storage attivato dall'upload), fai una POST a https://api.fotovid.co/v1/video/watermark con un header Authorization: Bearer p6_<key_id>:<secret>. Invia l'envelope standard: un source_url che punta all'URL HTTPS del tuo video — un signed URL di Supabase Storage funziona direttamente — più un oggetto params che descrive l'overlay, ad esempio type image, un watermark_image_url, una posizione come bottom-right e i parametri opacity o scale. La tua funzione fa solo una richiesta HTTPS; Fotovid esegue il lavoro ffmpeg all'esterno, quindi non tocchi mai i limiti di CPU o di tempo di Deno.
- 3Usa l'URL del risultato ospitato
La risposta è un JSON flat: un id, un type e un url che punta al video finito, ospitato da Fotovid. Restituisci quell'url direttamente al tuo chiamante, oppure scaricalo e conserva una tua copia in Supabase Storage. Considera l'URL ospitato come temporaneo — include un expires_at — quindi salvane una copia se ti serve a lungo termine.
Domande frequenti
Rilascialo con una sola chiamata API
Prendi una chiave gratuita e fai la tua prima chiamata in meno di cinque minuti.
