ffmpeg in Supabase Edge Functions

ffmpeg in Supabase Edge Functions – ausgelagert in einen einzigen HTTPS-Call.

Edge Functions laufen auf Deno – es gibt keinen child_process, um die ffmpeg-Binary zu starten. Behalt deine Function, lager das Encoding in einen HTTPS-Call aus, und zurück kommt die URL zur fertigen Datei.

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

Warum ffmpeg in deiner Edge Function nicht läuft

Supabase Edge Functions laufen auf der Deno-Runtime, und die hat weder child_process noch eine Subprocess-API – es gibt also schlicht nichts, womit du die ffmpeg-Binary starten könntest, selbst wenn du sie mitlieferst. Dazu kommt: Die CPU- und Laufzeitlimits sind auf schlanke Request-Logik ausgelegt, nicht auf die sekunden- bis minutenlange Dauerlast, die Medien-Encoding braucht. Ein Storage-Trigger ist der perfekte Ort, um einen Job zu *starten*, sobald eine Datei ankommt – das eigentliche Transcoding muss aber dort passieren, wo ein echter Encoder laufen darf.

  • Kein child_process / Subprocess unter Deno – die ffmpeg-Binary lässt sich nicht ausführen
  • CPU- und Laufzeitlimits sind für schnelle Logik gemacht, nicht für Medien-Encoding
  • Storage-Trigger sind ideal, um einen Job anzustoßen – laufen muss er woanders
  • Statische ffmpeg-Builds, WASM und Layers scheitern an der Runtime, nicht nur an der Größe

So versuchen Teams, ffmpeg auf Supabase zu betreiben

Vor Fotovid gab es nur diese Optionen – und jede davon ist Arbeit, die du dir lieber sparst.

OptionWhat it costs youVerdict
ffmpeg in deine Supabase-Function bundlenDeno hat keinen child_process – die Binary lässt sich nicht starten
Container oder VM selbst hostenDauerkosten plus Patchen, Skalieren und Monitoring
Job-Queue + Worker betreibenNeue Infrastruktur: Queue, Worker, Retries, Dead-Letter-Handling
Im Browser transcodieren (WASM)Langsam, speicherhungrig, stürzt auf Mobilgeräten ab
Die Fotovid-API aufrufenEin HTTPS-Request – nichts zu betreiben, zu packen oder zu skalieren
How it works

Dein erster Call in drei Schritten

  1. 1
    Kostenlosen API-Schlüssel holen

    Registrier dich und leg einen Schlüssel an. Fotovid rechnet nutzungsbasiert über Credits ab – $1 = 100 Credits, und die meisten Operationen kosten 1 Credit. So kannst du den Wasserzeichen-Call, unsere Kernfunktion, komplett anbinden und end-to-end testen, bevor du irgendetwas ausgibst.

  2. 2
    Den Wasserzeichen-Endpoint aus deiner Function aufrufen

    Aus derselben Edge Function heraus (oder aus dem Storage-Trigger, der beim Upload gefeuert hat) schickst du einen POST an https://api.fotovid.co/v1/video/watermark, mit dem Header Authorization: Bearer p6_<key_id>:<secret>. Im Body steht der Standard-Envelope: eine source_url, die auf die HTTPS-URL deines Videos zeigt – eine signierte URL aus Supabase Storage funktioniert direkt –, plus ein params-Objekt, das das Overlay beschreibt, z. B. type image, eine watermark_image_url, eine position wie bottom-right und opacity oder scale. Deine Function macht nur einen einzigen HTTPS-Request; die ffmpeg-Arbeit erledigt Fotovid außerhalb der Plattform – die CPU- und Zeitlimits von Deno berührst du nie.

  3. 3
    Die gehostete Ergebnis-URL nutzen

    Die Antwort ist flaches JSON: eine id, ein type und eine url, die auf das fertige, von Fotovid gehostete Video zeigt. Gib diese url direkt an deinen Aufrufer weiter oder lad die Datei herunter und leg eine eigene Kopie in Supabase Storage ab. Behandle die gehostete URL als temporär – sie trägt ein expires_at –, sichere dir also eine Kopie, wenn die Datei dauerhaft verfügbar sein soll.

Häufige Fragen

Mit einem API-Call live gehen

Hol dir einen kostenlosen Schlüssel und mach deinen ersten Call in unter fünf Minuten.