ffmpeg in Cloudflare Workers

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.

OptionWhat it costs youVerdict
ffmpeg in deine Function für Cloudflare Workers mitliefernWorkers können native Binaries grundsätzlich nicht ausführen
Container oder VM selbst hostenDauerkosten plus Patching, Skalierung und Monitoring
Job-Queue + Worker betreibenNeue Infrastruktur: Queue, Worker, Retries, Dead-Letter-Handling
Im Browser transcodieren (WASM)Langsam, speicherhungrig und stürzt auf Mobilgeräten ab
Die Fotovid-API aufrufenEin HTTPS-Request; nichts zu betreiben, zu paketieren oder zu skalieren
How it works

Dein erster Call in drei Schritten

  1. 1
    Kostenlosen 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.

  2. 2
    Video 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.

  3. 3
    Die 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.