Draai ffmpeg op Cloudflare Workers door het aan te roepen, niet te bundelen.
Workers draaien in een V8-isolate — geen filesystem, geen native binaries, harde CPU-limieten. Je Worker stuurt Fotovid een URL over HTTPS; de encode draait buiten de isolate en komt terug als gehoste link, dus het telt nooit mee voor je CPU-budget.
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 });
},
};Waarom je Worker vastloopt op ffmpeg
Cloudflare Workers draaien niet in een container — ze draaien in een V8-isolate. Er is geen filesystem om tijdelijke bestanden naartoe weg te schrijven, geen manier om een native binary aan te roepen, en strikte CPU-tijdlimieten per request. De ffmpeg-binary kan daar simpelweg niet bestaan. De WASM-build laadt technisch gezien wel, maar wordt afgeremd door het geheugen- en CPU-budget van de isolate en crasht bij alles wat verder gaat dan een triviaal clipje. Een gehoste API is de enige realistische route.
- Geen filesystem: ffmpeg heeft tijdelijke bestanden nodig om input te lezen en output te schrijven — Workers geven je die niet.
- Geen native binaries: je kunt de ffmpeg-binary niet installeren of uitvoeren in een V8-isolate.
- WASM-ffmpeg laadt wel, maar wordt beperkt door geheugen- en CPU-limieten van de isolate — bij echte video hapert het of loopt het vast op een timeout.
- Het strikte CPU-budget per request maakt elke langere transcodeklus kansloos.
Manieren waarop teams ffmpeg proberen te draaien op Cloudflare Workers
Vóór Fotovid waren dit de opties — stuk voor stuk werk dat je liever niet zelf doet.
| Option | What it costs you | Verdict |
|---|---|---|
| ffmpeg bundelen in je Cloudflare Workers-functie | Workers kunnen sowieso helemaal geen native binaries draaien | |
| Zelf een container of VM hosten | Doorlopende kosten plus patchen, schalen en monitoring | |
| Een jobqueue + worker draaien | Nieuwe infra: een queue, workers, retries, dead-letter handling | |
| Transcoden in de browser (WASM) | Traag, geheugenhongerig en crasht op mobiel | |
| De Fotovid-API aanroepen | Eén HTTPS-request; niets om te draaien, te packagen of te schalen |
Je eerste call in drie stappen
- 1Haal een gratis API-key op
Meld je aan en maak een key aan. Je krijgt een Authorization: Bearer p6_<key_id>:<secret> token dat elke call naar https://api.fotovid.co authenticeert. Geen infrastructuur, geen ffmpeg-build — gewoon een header.
- 2POST je video vanuit de Worker
Roep POST /v1/video/watermark aan met de standaard envelope: een source_url die naar de HTTPS-URL van je inputvideo wijst, en een params-object — zet type op image, text of combo, plus position (bijv. bottom-right), opacity en scale. Het is een simpele fetch vanuit je Worker, dus het past perfect bij het requestmodel van de isolate.
- 3Gebruik de gehoste resultaat-URL
Fotovid retourneert platte JSON: { id, type, url, expires_at, duration }. De url wijst naar je afgewerkte video met watermerk op Fotovids hosting. Geef hem direct door aan je client, of kopieer hem naar je eigen bucket om een permanente kopie te bewaren — het gehoste resultaat is tijdelijk.
Veelgestelde vragen
Zet het live met één API-aanroep
Pak een gratis key en doe je eerste aanroep in minder dan vijf minuten.
