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.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg in deine Netlify Function bündeln | Sprengt das 250-MB-Bundle und läuft ins 10-Sekunden-Timeout | |
| Container oder VM selbst hosten | Dauerkosten plus Patchen, Skalieren und Monitoring | |
| Job-Queue + Worker betreiben | Neue Infrastruktur: Queue, Worker, Retries, Dead-Letter-Handling | |
| Im Browser transkodieren (WASM) | Langsam, speicherhungrig und stürzt auf Mobilgeräten ab | |
| Die Fotovid-API aufrufen | Ein HTTPS-Request – nichts zu betreiben, zu packen oder zu skalieren |
Dein erster Call in drei Schritten
- 1Hole 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.
- 2Schicke 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.
- 3Nutze 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.
