ffmpeg su Supabase Edge Functions

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.

OptionWhat it costs youVerdict
Includere ffmpeg nella tua funzione SupabaseDeno non ha child_process — non puoi lanciare il binario
Ospitare tu stesso un container o una VMCosto always-on più patching, scaling e monitoring
Gestire una coda di job + workerNuova 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 FotovidUna richiesta HTTPS; niente da eseguire, impacchettare o scalare
How it works

La tua prima chiamata in tre passi

  1. 1
    Ottieni 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.

  2. 2
    Chiama 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.

  3. 3
    Usa 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.