ffmpeg auf Netlify Functions

ffmpeg auf Netlify Functions: zu groß fürs Bundle – gehostet statt gebündelt.

Netlify Functions laufen auf AWS Lambda – dort sprengt ffmpeg das Bundle-Limit und das Standard-Timeout. Gib den Job an Fotovid ab: ein Request raus, eine fertige Ergebnis-URL zurück – weit unter jedem Timeout.

// netlify/functions/watermark.mts
export default async (req: Request) => {
  const { videoUrl, logoUrl } = await req.json();

  const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${Netlify.env.get("FOTOVID_API_KEY")}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      source_url: videoUrl,
      params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
    }),
  });

  const { url } = await res.json();
  return Response.json({ url });
};

Warum ffmpeg auf Netlify immer wieder scheitert

Netlify Functions laufen auf AWS Lambda – und genau dort stößt ffmpeg an harte Wände. Ein statisches ffmpeg-Binary ist viel zu groß für das Bundle-Limit von ~50 MB gezippt / 250 MB entpackt: Entweder scheitert das Deployment, oder das Binary landet still und leise gar nicht erst im Bundle. Und selbst wenn du es hineinquetschst, killt das Standard-Timeout von 10 Sekunden jede echte Transkodierung – Background Functions verschaffen dir 26 Sekunden, was für die meisten Videojobs immer noch nicht reicht. Die klassische Falle: „Läuft auf meinem Laptop, läuft in Prod ins Timeout.“

  • ffmpeg-Binary + Libs sprengen das 250-MB-Bundle-Limit von Lambda (entpackt)
  • Standard-Timeout von 10 Sekunden (26 Sekunden im Background) bricht echte Transkodierungen mittendrin ab
  • Cold Starts und das Hantieren mit Lambda Layers kosten Latenz und Nerven
  • Was lokal läuft, läuft in der deployten Function noch lange nicht

Wie Teams versuchen, ffmpeg auf Netlify 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 Netlify Function bündelnSprengt das 250-MB-Bundle und läuft ins 10-Sekunden-Timeout
Container oder VM selbst hostenDauerkosten plus Patchen, Skalieren und Monitoring
Job-Queue + Worker betreibenNeue Infrastruktur: Queue, Worker, Retries, Dead-Letter-Handling
Im Browser transkodieren (WASM)Langsam, speicherhungrig und 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
    Hole dir einen kostenlosen API-Schlüssel

    Registriere dich und lege einen Schlüssel an. Authentifiziert wird über den Header Authorization: Bearer p6_<key_id>:<secret> – keine Binaries, keine Lambda Layers, nichts, was du in deine Netlify Function packen müsstest.

  2. 2
    Schicke dein Video per POST an den Wasserzeichen-Endpoint

    Rufe aus deiner Netlify Function POST /v1/video/watermark unter https://api.fotovid.co auf. Schicke den Standard-Envelope: eine source_url, die auf dein Eingangsvideo zeigt, plus ein params-Objekt – setze type auf image, text oder combo und gib dazu eine position wie bottom-right sowie opacity, scale und padding an. Die ffmpeg-Arbeit erledigt Fotovid außerhalb von Netlify: Deine Function macht nur einen schnellen HTTPS-Request, statt ein Binary aufzurufen, das sie gar nicht ausliefern kann.

  3. 3
    Nutze die gehostete Ergebnis-URL

    Die Antwort ist flaches JSON mit id, type, url und expires_at. Die url zeigt auf das fertige, von Fotovid gehostete Video. Gib sie an deinen Client weiter oder lege eine eigene Kopie an – Ergebnisse werden nur temporär gehostet, lade sie also herunter und speichere sie dort, wo deine Assets liegen.

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.