ffmpeg in Cloudflare Workers: aufrufen statt mitliefern.
Workers laufen in einem V8-Isolate – kein Dateisystem, keine nativen Binaries, harte CPU-Limits. Dein Worker schickt Fotovid per HTTPS eine URL; das Encoding läuft außerhalb des Isolates und kommt als gehosteter Link zurück, ohne je dein CPU-Budget zu belasten.
export default {
async fetch(req: Request, env: { FOTOVID_API_KEY: string }): Promise<Response> {
const { videoUrl, logoUrl } = await req.json();
const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
method: "POST",
headers: {
Authorization: `Bearer ${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 Response.json({ url });
},
};Warum dein Worker an ffmpeg scheitert
Cloudflare Workers laufen nicht in einem Container, sondern in einem V8-Isolate. Es gibt kein Dateisystem für temporäre Dateien, keine Möglichkeit, eine native Binary über die Shell zu starten, und strikte CPU-Zeit-Limits pro Request. Die ffmpeg-Binary kann dort schlicht nicht existieren. Der WASM-Build lädt zwar, wird aber vom Speicher- und CPU-Budget des Isolates ausgebremst und steigt bei allem aus, was über einen winzigen Clip hinausgeht. Eine gehostete API ist der einzige realistische Weg.
- Kein Dateisystem: ffmpeg braucht temporäre Dateien, um Input zu lesen und Output zu schreiben – Workers geben dir keine.
- Keine nativen Binaries: In einem V8-Isolate lässt sich die ffmpeg-Binary weder installieren noch ausführen.
- ffmpeg als WASM lädt zwar, ist aber durch Speicher- und CPU-Limits des Isolates gedeckelt – bei echten Videos hängt es oder läuft in einen Timeout.
- Das strikte CPU-Budget pro Request macht jeden echten Transcoding-Job von vornherein unmöglich.
So versuchen Teams, ffmpeg in Cloudflare Workers auszuführen
Vor Fotovid gab es nur diese Optionen – und jede davon ist Arbeit, die du dir nicht ans Bein binden willst.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg in deine Function für Cloudflare Workers mitliefern | Workers können native Binaries grundsätzlich nicht ausführen | |
| Container oder VM selbst hosten | Dauerkosten plus Patching, Skalierung und Monitoring | |
| Job-Queue + Worker betreiben | Neue Infrastruktur: Queue, Worker, Retries, Dead-Letter-Handling | |
| Im Browser transcodieren (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. Du bekommst ein Token der Form Authorization: Bearer p6_<key_id>:<secret>, das jeden Call an https://api.fotovid.co authentifiziert. Keine Infrastruktur, kein ffmpeg-Build – nur ein Header.
- 2Video aus dem Worker per POST schicken
Ruf POST /v1/video/watermark mit dem Standard-Envelope auf: eine source_url mit der HTTPS-URL deines Eingangsvideos und ein params-Objekt – setz type auf image, text oder combo, dazu position (z. B. bottom-right), opacity und scale. Das ist ein simpler fetch aus deinem Worker heraus und passt damit perfekt ins Request-Modell des Isolates.
- 3Die gehostete Ergebnis-URL nutzen
Fotovid antwortet mit flachem JSON: { id, type, url, expires_at, duration }. Die url zeigt auf dein fertiges Video mit Wasserzeichen auf dem Hosting von Fotovid. Gib sie direkt an deinen Client weiter oder kopier die Datei in deinen eigenen Bucket, wenn du sie dauerhaft behalten willst – das gehostete Ergebnis ist temporär.
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.
