ffmpeg op Vercel

ffmpeg op Vercel breekt bij deploy — roep een API aan die dat niet doet.

Het werkte op localhost, en brak op het moment dat je deployde. Dat ligt niet aan je code, maar aan de runtime. Laat je Vercel-function Fotovid aanroepen: hij stuurt een source URL, Fotovid geeft de gerenderde media terug.

// 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 });
}

Waarom ffmpeg breekt op Vercel

Vercel is een geweldige plek om je app te draaien en een vijandige om ffmpeg te draaien. Node serverless functions beperken de uitgepakte bundle tot 250MB, en ffmpeg met codecs schiet daar al overheen voordat je eigen code meetelt. Schakel je over naar de Edge runtime om de size-limiet te ontwijken, dan verlies je child_process volledig, dus is er geen manier om een binary te starten. Zelfs als een build erdoorheen glipt, breekt de function timeout (10s op Hobby, begrensd op Pro) elke echte encode halverwege af. ffmpeg-static en fluent-ffmpeg werken lokaal en falen bij deploy, exact om deze redenen.

  • 250MB-limiet voor uitgepakte functions: ffmpeg met codecs past niet in een Node serverless bundle
  • De Edge runtime heeft geen Node-API's en geen child_process, dus kun je geen binary starten
  • Function timeouts (10s Hobby, begrensd op Pro) breken lange encodes halverwege af
  • ffmpeg-static en fluent-ffmpeg werken op localhost en breken zodra je deployt

Manieren waarop teams ffmpeg op Vercel proberen te draaien

Vóór Fotovid waren dit de opties — stuk voor stuk werk dat je liever niet zelf doet.

OptionWhat it costs youVerdict
ffmpeg bundelen in je Vercel-functionSchiet over de 250MB function-limiet heen; Edge heeft geen child_process
Zelf een container of VM hostenDoorlopende kosten plus patchen, schalen en monitoren
Een job queue + worker draaienNieuwe infra: een queue, workers, retries, dead-letter-afhandeling
Transcoderen in de browser (WASM)Traag, geheugenhongerig en crasht op mobiel
De Fotovid API aanroepenEén HTTPS-request; niets om te draaien, te packagen of te schalen
How it works

Je eerste call in drie stappen

  1. 1
    Haal een gratis API key op

    Meld je aan en maak een key, geen kaart nodig. Je krijgt een token in de vorm p6_<key_id>:<secret> dat je meestuurt als Bearer authorization header. Zet die in de environment variables van je Vercel-project, zodat je function er tijdens runtime bij kan.

  2. 2
    POST je video naar het watermark endpoint

    Roep vanuit je Vercel-function POST /v1/video/watermark aan op https://api.fotovid.co met de standaard envelope: een source_url die naar je invoervideo wijst, plus een params-object dat de overlay beschrijft (een image- of text-watermark, positie, opacity en scale). Geen binary, geen bundle, geen encode die binnen je function draait. Fotovid doet het ffmpeg-werk op zijn eigen infrastructuur, dus jouw timeout komt er nooit aan te pas.

  3. 3
    Gebruik de teruggegeven gehoste URL

    De response komt terug als platte JSON met een id, type, een door fotovid gehoste url voor de afgewerkte video en een expires_at. Sla zelf een kopie van dat bestand op, of geef de URL direct door aan je frontend. Dezelfde envelope werkt voor de rest van de API: trim, extract-audio, extract-cover, probe en meer.

Veelgestelde vragen

Zet het live met één API-aanroep

Pak een gratis key en doe je eerste aanroep in minder dan vijf minuten.