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.
| Option | What it costs you | Verdict |
|---|---|---|
| Embarquer ffmpeg dans ta fonction Supabase | Deno n'a pas de child_process — impossible de lancer le binaire | |
| Auto-héberger un conteneur ou une VM | Coût permanent, plus patching, scaling et monitoring | |
| Faire tourner une file de jobs + des workers | Nouvelle 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 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é. 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.
- 2Appelle 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.
- 3Utilise 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.
