ffmpeg sur Deno Deploy

Pourquoi ffmpeg ne peut pas tourner sur Deno Deploy ? Pas de sous-processus — alors appelle l'API.

Deno Deploy exécute ton code dans des isolates V8 sans sous-processus ni FFI, donc le binaire ffmpeg ne peut pas démarrer. Appelle plutôt Fotovid via fetch() : l'encodage tourne ailleurs et tu récupères en réponse un simple lien https vers le fichier.

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,
      params: { type: "image", watermark_image_url: logoUrl, position: "bottom-right" },
    }),
  });

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

Le modèle isolate empêche purement et simplement ffmpeg de tourner

Deno Deploy repose sur des isolates V8 conçus pour de la logique edge rapide, pas pour de l'encodage média gourmand en CPU. Il n'y a ni API de sous-processus pour lancer un binaire natif, ni FFI pour en charger un, donc le processus ffmpeg ne démarre jamais. Ce n'est pas un flag de config ou une permission à accorder : les primitives dont ffmpeg a besoin n'existent tout simplement pas dans le sandbox de l'isolate. Des portages WebAssembly de ffmpeg existent, mais ils dépassent largement les limites de CPU et de mémoire des isolates sur toute vidéo réelle, et ne peuvent pas faire transiter un gros fichier en streaming.

  • Pas de sous-processus : Deno.Command et child_process ne peuvent pas lancer le binaire ffmpeg dans un isolate.
  • Pas de FFI : impossible de faire un dlopen sur une bibliothèque ffmpeg native et de l'appeler directement.
  • ffmpeg en Wasm épuise le CPU/la mémoire de l'isolate sur de vraies vidéos et ne peut pas streamer de gros fichiers en entrée.
  • La plateforme est calibrée pour des requêtes edge courtes, pas pour des jobs d'encodage de plusieurs secondes.

Comment les équipes essaient de faire tourner ffmpeg sur Deno Deploy

Avant Fotovid, c'étaient les seules options — et chacune est un travail dont tu te passerais bien.

OptionWhat it costs youVerdict
Embarquer ffmpeg dans ta fonction Deno DeployPas de sous-processus pour lancer le binaire ffmpeg
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, les 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é — pas de carte bancaire nécessaire pour démarrer. Tu obtiens un key ID et un secret qui se combinent en un token Bearer de la forme p6_<key_id>:<secret>. Stocke-le dans une variable d'environnement Deno Deploy pour que ton isolate puisse s'authentifier sans embarquer le moindre binaire.

  2. 2
    Envoie un POST vers l'endpoint watermark

    Depuis ton handler Deno, fais un fetch classique en POST vers https://api.fotovid.co/v1/video/watermark avec ton token Bearer. Envoie l'enveloppe standard : un source_url pointant vers l'URL HTTPS de ta vidéo source, plus un objet params décrivant le watermark — type (image, text ou combo), le watermark_image_url ou text, la position comme bottom-right, l'opacity et le scale. Fotovid récupère la source, exécute ffmpeg sur sa propre infrastructure, et répond avant que ton isolate n'atteigne son timeout.

  3. 3
    Utilise l'URL renvoyée

    La réponse est un JSON plat : un id, un type, et une url pointant vers la vidéo finalisée hébergée par Fotovid, plus expires_at et duration. Transmets cette url directement à ton client, ou récupère-la côté serveur pour en garder ta propre copie dans le bucket que tu utilises déjà. La plupart des opérations coûtent 1 credit, donc un appel watermark ne débite qu'un seul credit de ton solde.

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.