ffmpeg su Netlify Functions

ffmpeg su Netlify Functions: troppo grande da includere, lo ospitiamo noi al posto tuo.

Le Netlify Functions girano su AWS Lambda, quindi ffmpeg sfonda sia il limite del bundle sia il timeout predefinito. Affida il lavoro a Fotovid: una richiesta in uscita, un URL del risultato pronto in risposta — ben entro qualsiasi timeout.

// netlify/functions/watermark.mts
export default async (req: Request) => {
  const { videoUrl, logoUrl } = await req.json();

  const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${Netlify.env.get("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 });
};

Perché ffmpeg continua a fallire su Netlify

Le Netlify Functions vengono eseguite su AWS Lambda, ed è proprio lì che ffmpeg si scontra con dei muri. Un binario ffmpeg statico è troppo grande per il limite di bundle di ~50MB zippati / 250MB non zippati: il deploy fallisce, oppure il binario semplicemente non viene incluso, senza alcun avviso. Anche quando riesci a farlo entrare, il timeout predefinito di 10s della funzione uccide qualsiasi transcodifica reale — le funzioni in background ti danno 26s, che comunque non bastano per la maggior parte dei lavori video. È la classica trappola del 'funziona sul mio laptop, va in timeout in produzione'.

  • Il binario ffmpeg e le librerie superano il limite di bundle di 250MB non zippati di Lambda
  • Il timeout predefinito di 10s (26s in background) interrompe le transcodifiche reali a metà
  • I cold start e la gestione dei layer aggiungono latenza e grattacapi di packaging
  • Il successo in locale non si riproduce nella funzione distribuita

Come i team provano a far girare ffmpeg su Netlify

Prima di Fotovid queste erano le opzioni — e ognuna è un lavoro che preferiresti evitare.

OptionWhat it costs youVerdict
Includere ffmpeg nella tua Netlify FunctionSupera il bundle di 250MB e raggiunge il timeout di 10s della funzione
Fare self-hosting di un container o una VMCosto continuo più patching, scaling e monitoring
Gestire una coda di job + workerNuova infrastruttura: coda, worker, retry, gestione dei dead-letter
Transcodificare nel browser (WASM)Lento, consuma troppa memoria e va in crash su mobile
Chiamare l'API di FotovidUna sola richiesta HTTPS; niente da eseguire, impacchettare o scalare
How it works

La tua prima chiamata in tre passaggi

  1. 1
    Ottieni una chiave API gratuita

    Registrati e crea una chiave. Ti autentichi con un header Authorization: Bearer p6_<key_id>:<secret> — nessun binario, nessun layer Lambda, niente da includere nella tua Netlify Function.

  2. 2
    Invia il tuo video in POST all'endpoint watermark

    Dall'interno della tua Netlify Function, chiama POST /v1/video/watermark su https://api.fotovid.co. Invia l'envelope standard: un source_url che punta al tuo video di input più un oggetto params — imposta type su image, text o combo, poi scegli una position come bottom-right, oltre a opacity, scale e padding. Fotovid esegue il lavoro di ffmpeg fuori dalla tua piattaforma, quindi la tua funzione fa solo una rapida richiesta HTTPS invece di dover invocare un binario che comunque non potrebbe includere.

  3. 3
    Usa l'URL del risultato ospitato

    La risposta è un JSON piatto con id, type, url ed expires_at. L'url punta al video finito, ospitato da Fotovid. Restituiscilo al tuo client o conserva una tua copia — dato che i risultati sono ospitati solo temporaneamente, scaricali e riarchivali dove tieni i tuoi asset.

Domande frequenti

Rilascialo con una sola chiamata API

Prendi una chiave gratuita e fai la tua prima chiamata in meno di cinque minuti.