Convertir des vidéos directement avec NodeJS, désormais c'est possible !

Connaissez-vous notre seigneur FFMPEG ?

Article publié le 02/12/2020, dernière mise à jour le 19/09/2023

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 :

_


Jakob Owens sur Unsplash

Vous avez terminé l'article ?

Commentaires (0)

pour laisser un commentaire

Aucun commentaire pour l'instant