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.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg bundelen in je Supabase function | Deno heeft geen child_process — je kunt de binary niet spawnen | |
| Zelf een container of VM hosten | Doorlopende kosten plus patchen, schalen en monitoren | |
| Een job queue + worker draaien | Nieuwe infra: een queue, workers, retries, dead-letter-afhandeling | |
| Transcoden in de browser (WASM) | Traag, geheugenintensief en crasht op mobiel | |
| De Fotovid API aanroepen | Eén HTTPS-request; niets om te draaien, te packagen of te schalen |
Je eerste call in drie stappen
- 1Haal 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.
- 2Roep 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.
- 3Gebruik 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.
