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.
| Option | What it costs you | Verdict |
|---|---|---|
| Includere ffmpeg nella tua Netlify Function | Supera il bundle di 250MB e raggiunge il timeout di 10s della funzione | |
| Fare self-hosting di un container o una VM | Costo continuo più patching, scaling e monitoring | |
| Gestire una coda di job + worker | Nuova 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 Fotovid | Una sola richiesta HTTPS; niente da eseguire, impacchettare o scalare |
La tua prima chiamata in tre passaggi
- 1Ottieni 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.
- 2Invia 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.
- 3Usa 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.
