ffmpeg sur Cloudflare Workers

Appelle ffmpeg sur Cloudflare Workers, ne l'embarque pas.

Les Workers tournent dans un isolate V8 — pas de filesystem, pas de binaires natifs, des limites CPU strictes. Ton Worker envoie une URL à Fotovid via HTTPS ; l'encodage s'exécute hors de l'isolate et revient sous forme de lien hébergé, sans jamais entamer ton budget CPU.

export default {
  async fetch(req: Request, env: { FOTOVID_API_KEY: string }): Promise<Response> {
    const { videoUrl, logoUrl } = await req.json();

    const res = await fetch("https://api.fotovid.co/v1/video/watermark", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${env.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 ton Worker cale sur ffmpeg

Cloudflare Workers ne tournent pas dans un conteneur, mais dans un isolate V8. Il n'y a pas de filesystem pour écrire des fichiers temporaires, aucun moyen de lancer un binaire natif via un shell, et des limites de temps CPU strictes par requête. Le binaire ffmpeg ne peut tout simplement pas exister là-dedans. Le build WASM se charge techniquement, mais il est bridé par le budget mémoire et CPU de l'isolate et plante dès qu'on dépasse un clip minuscule. Une API hébergée est le seul chemin réaliste.

  • Pas de filesystem : ffmpeg a besoin de fichiers temporaires pour lire l'entrée et écrire la sortie — les Workers n'en fournissent aucun.
  • Pas de binaires natifs : impossible d'installer ou d'exécuter le binaire ffmpeg dans un isolate V8.
  • ffmpeg en WASM se charge, mais reste plafonné par les limites de mémoire et de CPU de l'isolate — il se bloque ou expire sur une vraie vidéo.
  • Le budget CPU strict par requête rend irréalisable toute tâche aussi longue qu'un transcodage.

Comment les équipes essaient de faire tourner ffmpeg sur Cloudflare Workers

Avant Fotovid, c'était les options — et chacune est un boulet que tu préférerais ne pas te traîner.

OptionWhat it costs youVerdict
Embarquer ffmpeg dans ta fonction Cloudflare WorkersLes Workers ne peuvent exécuter aucun binaire natif
Auto-héberger un conteneur ou une VMCoût permanent, plus patchs, scaling et supervision
Faire tourner une file d'attente + 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 obtiens un token Authorization: Bearer p6_<key_id>:<secret> qui authentifie chaque appel vers https://api.fotovid.co. Aucune infrastructure, aucun build ffmpeg — juste un header.

  2. 2
    Envoie ta vidéo en POST depuis le Worker

    Appelle POST /v1/video/watermark avec l'enveloppe standard : une source_url pointant vers l'URL HTTPS de ta vidéo d'entrée, et un objet params — définis type sur image, text ou combo, plus position (par ex. bottom-right), opacity et scale. C'est un simple fetch depuis ton Worker, donc ça s'intègre parfaitement au modèle de requête de l'isolate.

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

    Fotovid renvoie un JSON plat : { id, type, url, expires_at, duration }. L'url pointe vers ta vidéo finie, avec filigrane, hébergée par Fotovid. Transmets-la directement à ton client, ou copie-la dans ton propre bucket pour en garder une copie permanente — le résultat hébergé est temporaire.

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.