J'en vois déjà certains me dire que tout est possible à partir du moment où l'on créé un nouveau processus système à partir de notre environnement NodeJS grâce à une commande comme spawn() par exemple.

Si vous ne connaissez pas les méthodes spawn() et exec() du module child_process de NodeJS,  je vous invite à lire mon article où j'explique leur fonctionnement !

Sauf qu'ici, il ne s'agit pas de ça. Je ne parle pas d'appeler l'exécutable de la librairie FFMPEG installée sur le système, non je parle bel et bien de faire tourner FFMPEG dans NodeJS !

Mais comment est-ce possible ? Tout simplement grâce à une technologie que j'ai déjà présentée sur le blog : le WebAssembly.

Pour faire court, le WebAssembly permet de compiler du code bas-niveau en bytecode exécutable (WASM) par le moteur d'exécution Javascript.

Convertir une vidéo avec NodeJS et FFMPEG

Je tiens à préciser que l'exemple suivant fonctionne aussi sur certains navigateurs supportant les "SharedArrayBuffer", soit actuellement Google Chrome.

La première étape est d'importer le module FFMPEG dans votre projet node en exécutant la commande suivante :

# Use npm
$ npm install @ffmpeg/ffmpeg @ffmpeg/core

À partir de ce moment, vous pourrez convertir facilement vos fichiers vidéo en exploitant la puissante incroyable de FFMPEG, simplement depuis votre script NodeJS :

const fs = require('fs');
const { createFFmpeg, fetchFile } = require('@ffmpeg/ffmpeg');
const ffmpeg = createFFmpeg({ log: true });

(async () => {
  await ffmpeg.load();
  ffmpeg.FS('writeFile', 'example.avi', await fetchFile('./example.avi'));
  await ffmpeg.run('-i', 'example.avi', 'example.mp4');
  await fs.promises.writeFile('./example.mp4', ffmpeg.FS('readFile', 'example.mp4'));
  process.exit(0);
})();

Personnellement, j'utilise la dernière version de NodeJS (15.3.0) et pour que le script fonctionne je dois ajouter les flags suivant : "--experimental-wasm-threads --experimental-wasm-bulk-memory"

Attention, les flags doivent être ajoutés avant le nom du script à exécuter, comme ceci :

$ node --experimental-wasm-threads --experimental-wasm-bulk-memory index.js

Et voilà, en quelques secondes (selon la durée de votre vidéo), vous pourrez récupérer votre fichier example.mp4 tout neuf ! Si vous voulez utiliser un fichier vidéo de test en .avi, vous pourrez en trouver juste ici : https://www.engr.colostate.edu/me/facil/dynamics/avis.htm

Pour en savoir plus et découvrir tout ce qu'il est possible de faire avec la version WASM de FFMPEG, je vous invite à consulter la doc sur Github :

FFMPEG.WASM
ffmpeg.wasm is a pure WebAssembly / JavaScript port of FFmpeg. It enables video & audio record, convert and stream right inside browsers.
J'espère que cet article vous aura plu, et à bientôt sur le blog !

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage de d'expériences et de connaissances.

Aujourd'hui je suis aussi coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et être tenu au courant de mes projets !


Photo par Jakob Owens sur Unsplash