ffmpeg sur Supabase Edge Functions

ffmpeg sur Supabase Edge Functions, délégué à un simple appel HTTPS.

Les Edge Functions tournent sur Deno, donc il n'y a pas de child_process pour lancer le binaire ffmpeg. Garde ta fonction, délègue l'encodage à un appel HTTPS et récupère l'URL du fichier terminé.

// supabase/functions/watermark/index.ts
Deno.serve(async (req) => {
  const { videoUrl, logoUrl } = await req.json();

  const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${Deno.env.get("FOTOVID_API_KEY")}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      source_url: videoUrl, // a Supabase Storage signed URL works here
      params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
    }),
  });

  const { url } = await res.json();
  return Response.json({ url });
});

Pourquoi ffmpeg ne tournera pas dans ta Edge Function

Les Supabase Edge Functions s'exécutent sur le runtime Deno, qui n'a pas d'API child_process ni subprocess — il n'y a donc rien pour lancer le binaire ffmpeg, même si tu l'embarques. En plus de ça, les limites de CPU et de temps d'exécution sont calibrées pour de la logique de requête légère, pas pour les quelques secondes à minutes de travail soutenu qu'exige l'encodage média. Un Storage trigger est l'endroit idéal pour *démarrer* un job dès qu'un fichier arrive, mais le transcodage lui-même doit se dérouler quelque part capable de faire tourner un vrai encodeur.

  • Pas de child_process / subprocess sur Deno — impossible d'exécuter le binaire ffmpeg
  • Les limites de CPU et de temps d'exécution visent une logique rapide, pas l'encodage média
  • Les Storage triggers sont parfaits pour déclencher un job, mais le travail doit se faire ailleurs
  • Builds ffmpeg statiques, WASM, layers : tout bute sur le runtime, pas seulement sur la taille

Comment les équipes essaient de faire tourner ffmpeg sur Supabase

Avant Fotovid, voici les options — chacune est un travail dont tu te passerais bien.

OptionWhat it costs youVerdict
Embarquer ffmpeg dans ta fonction SupabaseDeno n'a pas de child_process — impossible de lancer le binaire
Auto-héberger un conteneur ou une VMCoût permanent, plus patching, scaling et monitoring
Faire tourner une file de jobs + des workersNouvelle infra : une file, 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é. Fotovid fonctionne avec des credits d'usage — 1 $ = 100 credits et la plupart des opérations coûtent 1 credit — donc tu peux brancher l'appel phare de filigrane et le tester de bout en bout avant de dépenser quoi que ce soit.

  2. 2
    Appelle l'endpoint de filigrane depuis ta fonction

    Depuis cette même Edge Function (ou le Storage trigger déclenché à l'upload), fais un POST vers https://api.fotovid.co/v1/video/watermark avec un header Authorization: Bearer p6_<key_id>:<secret>. Envoie l'enveloppe standard : un source_url pointant vers l'URL HTTPS de ta vidéo — une URL présignée par Supabase Storage fonctionne directement — plus un objet params décrivant la superposition, par ex. type image, une watermark_image_url, une position comme bottom-right et une opacity ou un scale. Ta fonction ne fait qu'une seule requête HTTPS ; Fotovid exécute le travail ffmpeg en dehors de la plateforme, donc tu ne touches jamais aux limites de CPU ou de temps de Deno.

  3. 3
    Utilise l'URL du résultat hébergé

    La réponse est un JSON plat : un id, un type et une url pointant vers la vidéo terminée, hébergée par Fotovid. Renvoie directement cette url à ton appelant, ou télécharge-la et stocke ta propre copie dans Supabase Storage. Considère l'URL hébergée comme temporaire — elle porte un expires_at — donc conserve une copie si tu en as besoin sur le long terme.

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.