ffmpeg sur Netlify Functions : trop volumineux à embarquer, on l'héberge à ta place.
Les Netlify Functions tournent sur AWS Lambda, donc ffmpeg dépasse largement la limite de bundle et le timeout par défaut. Confie le travail à Fotovid : une requête envoyée, une URL de résultat prête en retour — largement sous n'importe quel 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 });
};Pourquoi ffmpeg échoue toujours sur Netlify
Les Netlify Functions s'exécutent sur AWS Lambda, et c'est précisément là que ffmpeg se heurte à des murs. Un binaire ffmpeg statique est bien trop volumineux pour la limite de bundle de ~50 MB zippés / 250 MB dézippés : le déploiement échoue, ou le binaire ne part tout simplement pas, sans avertissement. Même quand tu arrives à le faire rentrer, le timeout par défaut de 10 s de la fonction tue tout transcodage sérieux — les fonctions en arrière-plan t'offrent 26 s, ce qui reste insuffisant pour la plupart des traitements vidéo. C'est le piège classique du « ça marche sur ma machine, ça part en timeout en prod ».
- Le binaire ffmpeg + ses libs dépassent la limite de bundle Lambda de 250 MB dézippés
- Le timeout par défaut de 10 s (26 s en arrière-plan) coupe les vrais transcodages en plein milieu
- Les cold starts et la gestion des layers ajoutent de la latence et des galères de packaging
- Ce qui marche en local ne se reproduit pas dans la fonction déployée
Comment les équipes essaient de faire tourner ffmpeg sur Netlify
Avant Fotovid, c'étaient les options — et chacune est un travail dont tu te passerais bien.
| Option | What it costs you | Verdict |
|---|---|---|
| Embarquer ffmpeg dans ta fonction Netlify | Dépasse le bundle de 250 MB et atteint le timeout de 10 s de la fonction | |
| Héberger toi-même un conteneur ou une VM | Coût permanent, plus les correctifs, le scaling et le monitoring | |
| Faire tourner une file de jobs + un worker | Nouvelle infra : une queue, des workers, des retries, la gestion des dead-letters | |
| Transcoder dans le navigateur (WASM) | Lent, gourmand en mémoire, et plante sur mobile | |
| Appeler l'API Fotovid | Une seule requête HTTPS ; rien à faire tourner, packager ou scaler |
Ton premier appel en trois étapes
- 1Récupère une clé API gratuite
Inscris-toi et crée une clé. Tu t'authentifies avec un header Authorization: Bearer p6_<key_id>:<secret> — pas de binaires, pas de layers Lambda, rien à embarquer dans ta Netlify Function.
- 2POST ta vidéo vers l'endpoint watermark
Depuis ta Netlify Function, appelle POST /v1/video/watermark sur https://api.fotovid.co. Envoie l'enveloppe standard : un source_url pointant vers ta vidéo d'entrée, plus un objet params — définis type sur image, text ou combo, puis choisis une position comme bottom-right, plus opacity, scale et padding. Fotovid fait le travail ffmpeg en dehors de ta plateforme, donc ta fonction se contente d'une seule requête HTTPS rapide, plutôt que de devoir invoquer un binaire qu'elle ne peut de toute façon pas embarquer.
- 3Utilise l'URL du résultat hébergé
La réponse est un JSON plat avec un id, un type, une url et un expires_at. L'url pointe vers la vidéo finie, hébergée par Fotovid. Renvoie-la à ton client ou conserve ta propre copie — les résultats étant hébergés temporairement, télécharge-les et re-stocke-les là où tu gères tes assets.
Questions fréquentes
Déploie-le avec un seul appel API
Récupère une clé gratuite et fais ton premier appel en moins de cinq minutes.
