ffmpeg sur Netlify Functions

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.

OptionWhat it costs youVerdict
Embarquer ffmpeg dans ta fonction NetlifyDé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 VMCoût permanent, plus les correctifs, le scaling et le monitoring
Faire tourner une file de jobs + un workerNouvelle 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 FotovidUne seule requête HTTPS ; rien à faire tourner, packager ou scaler
How it works

Ton premier appel en trois étapes

  1. 1
    Ré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.

  2. 2
    POST 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.

  3. 3
    Utilise 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.