ffmpeg auf Vercel scheitert beim Deploy – ein API-Call nicht.
Lokal lief alles, beim Deploy war Schluss. Das liegt nicht an deinem Code, sondern an der Runtime. Lass deine Vercel-Function stattdessen Fotovid aufrufen: Du schickst eine Quell-URL, Fotovid gibt die fertige Mediendatei zurück.
// app/api/watermark/route.ts
import { NextResponse } from "next/server";
export async function POST(req: Request) {
const { videoUrl, logoUrl } = await req.json();
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.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 NextResponse.json({ url });
}Warum ffmpeg auf Vercel scheitert
Vercel ist ein hervorragender Ort für deine App – und ein denkbar schlechter für ffmpeg. Serverless-Functions auf Node deckeln das entpackte Bundle bei 250 MB, und ffmpeg samt Codecs sprengt dieses Limit, bevor auch nur eine Zeile deines eigenen Codes mitzählt. Wechselst du auf die Edge Runtime, um dem Größenlimit zu entkommen, fällt child_process komplett weg – ein Binary lässt sich dort gar nicht erst starten. Und selbst wenn ein Build durchrutscht: Das Function-Timeout (10 s bei Hobby, auf Pro nach oben begrenzt) bricht jedes ernsthafte Encoding mittendrin ab. Genau deshalb laufen ffmpeg-static und fluent-ffmpeg lokal sauber durch und scheitern beim Deploy.
- 250-MB-Limit für entpackte Functions: ffmpeg samt Codecs passt in kein Serverless-Bundle auf Node
- Die Edge Runtime hat keine Node-APIs und kein child_process – du kannst kein Binary starten
- Function-Timeouts (10 s bei Hobby, begrenzt bei Pro) brechen lange Encodings mittendrin ab
- ffmpeg-static und fluent-ffmpeg laufen lokal und scheitern in dem Moment, in dem du deployst
Wie Teams versuchen, ffmpeg auf Vercel zu betreiben
Vor Fotovid gab es diese Optionen – und jede davon ist Arbeit, die du dir lieber sparst.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg in deine Vercel-Function bundeln | Sprengt das 250-MB-Limit der Function; Edge hat kein child_process | |
| Container oder VM selbst hosten | Dauerkosten plus Patching, Scaling 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 paketieren oder zu skalieren |
Dein erster Call in drei Schritten
- 1Kostenlosen API-Schlüssel holen
Registriere dich und leg einen Schlüssel an – ganz ohne Kreditkarte. Du bekommst ein Token in der Form p6_<key_id>:<secret>, das du als Bearer-Authorization-Header mitschickst. Hinterleg es in den Environment Variables deines Vercel-Projekts, damit deine Function es zur Laufzeit lesen kann.
- 2Dein Video per POST an den Wasserzeichen-Endpoint schicken
Ruf aus deiner Vercel-Function POST /v1/video/watermark unter https://api.fotovid.co auf – mit dem Standard-Envelope: eine source_url, die auf dein Ausgangsvideo zeigt, plus ein params-Objekt, das das Overlay beschreibt (Bild- oder Text-Wasserzeichen, Position, Deckkraft und Skalierung). Kein Binary, kein Bundle, kein Encoding in deiner Function. Fotovid erledigt die ffmpeg-Arbeit auf eigener Infrastruktur – dein Function-Timeout spielt damit keine Rolle mehr.
- 3Die gehostete URL aus der Antwort nutzen
Die Antwort kommt als flaches JSON zurück – mit einer id, einem type, einer von Fotovid gehosteten url zum fertigen Video und einem expires_at. Sichere dir eine eigene Kopie der Datei oder gib die URL direkt an dein Frontend weiter. Derselbe Envelope gilt für den Rest der API: trim, extract-audio, extract-cover, probe und mehr.
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.
