ffmpeg op Supabase Edge Functions

ffmpeg op Supabase Edge Functions, uitbesteed aan één HTTPS-call.

Edge Functions draaien op Deno, dus er is geen child_process om de ffmpeg-binary te spawnen. Behoud je function, besteed het encoden uit aan een HTTPS-call en krijg een URL naar het kant-en-klare bestand terug.

// 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 });
});

Waarom ffmpeg niet draait in je Edge Function

Supabase Edge Functions draaien op de Deno-runtime, die geen child_process of subprocess API heeft — er is dus niets om de ffmpeg-binary mee te spawnen, ook niet als je die bundelt. Bovendien zijn de CPU- en wall-clock-limieten afgestemd op lichte request-logica, niet op de seconden tot minuten aanhoudende belasting die media-encoding vraagt. Een Storage trigger is de perfecte plek om een job te *starten* zodra een bestand binnenkomt, maar de daadwerkelijke transcode moet ergens gebeuren waar een echte encoder kan draaien.

  • Geen child_process / subprocess op Deno — je kunt de ffmpeg-binary niet uitvoeren
  • CPU- en wall-clock-limieten zijn gericht op snelle logica, niet op media-encoding
  • Storage triggers zijn ideaal om een job te starten, maar het werk moet elders draaien
  • Statische ffmpeg-builds, WASM en layers lopen allemaal vast op de runtime, niet alleen op de grootte

Manieren waarop teams ffmpeg op Supabase proberen te draaien

Vóór Fotovid waren dit de opties — stuk voor stuk werk dat je liever niet zelf doet.

OptionWhat it costs youVerdict
ffmpeg bundelen in je Supabase functionDeno heeft geen child_process — je kunt de binary niet spawnen
Zelf een container of VM hostenDoorlopende kosten plus patchen, schalen en monitoren
Een job queue + worker draaienNieuwe infra: een queue, workers, retries, dead-letter-afhandeling
Transcoden in de browser (WASM)Traag, geheugenintensief en crasht op mobiel
De Fotovid API aanroepenEén HTTPS-request; niets om te draaien, te packagen of te schalen
How it works

Je eerste call in drie stappen

  1. 1
    Haal een gratis API key op

    Meld je aan en maak een key aan. Fotovid werkt met usage credits — $1 = 100 credits en de meeste operaties kosten 1 credit — dus je kunt de flagship watermark-call aansluiten en end-to-end testen voordat je iets uitgeeft.

  2. 2
    Roep het watermark-endpoint aan vanuit je function

    Vanuit diezelfde Edge Function (of de Storage trigger die bij de upload afging) doe je een POST naar https://api.fotovid.co/v1/video/watermark met een Authorization: Bearer p6_<key_id>:<secret> header. Stuur de standaard envelope: een source_url die naar de HTTPS-URL van je video wijst — een signed URL uit Supabase Storage werkt direct — plus een params-object dat de overlay beschrijft, bijvoorbeeld type image, een watermark_image_url, een position zoals bottom-right, en een opacity of scale. Je function doet maar één HTTPS-request; Fotovid voert het ffmpeg-werk off-platform uit, dus je komt nooit aan de CPU- of tijdslimieten van Deno.

  3. 3
    Gebruik de gehoste result-URL

    De response is flat JSON: een id, een type en een url die naar de kant-en-klare, door Fotovid gehoste video wijst. Geef die url direct terug aan je caller, of download het bestand en bewaar je eigen kopie in Supabase Storage. Behandel de gehoste URL als tijdelijk — er zit een expires_at op — bewaar dus een kopie als je het bestand langdurig nodig hebt.

Veelgestelde vragen

Zet het live met één API-aanroep

Pak een gratis key en doe je eerste aanroep in minder dan vijf minuten.