fbpx

NodeJS per convertire video


19 Ott 2021 - Informatica, Software


NodeJS per convertire video

Usiamo NodeJS per convertire video da AVI ad mp4. Useremo handbrake-js per la conversione e fs per leggere il contenuto della cartella.

NodeJS per convertire video: Il problema


In questo articolo ti ho fatto vedere come creare delle API con NodeJS ed ExpressJS e rendere fruibili tramite VueJS i filmati contenuti in una cartella del server.
HTML5 ha sostanzialmente un problema con dei Codec. I file mp4 sono letti in maniera egregia e sono supportati da molti browser.
Altri formati come l’AVI, no!
Ecco qui che mi è venuto in mente di mettermi a cercare in rete per trovare qualcosa che potesse convertire automaticamente i video AVI in mp4.
Ecco che ho trovato!!!

Lo strumento principale: Handbrake-JS


Dopo svariate ricerche ho trovato ciò che faceva a caso mio : Handbrake-JS.
Puoi trovare la documentazione e le istruzioni di installazione qui : https://www.npmjs.com/package/handbrake-js
Cos’è? Cito e traduco:

Aspira a fornire una base snella e stabile per la creazione di software di transcodifica video in node.js.

HandBrake è uno strumento per convertire video da quasi tutti i formati in una selezione di codec moderni e ampiamente supportati. Può elaborare i file multimediali più comuni e qualsiasi sorgente DVD o BluRay che non contiene alcuna protezione dalla copia.

documentazione handbrake-js

La doc suggerisce questo codice per iniziare a codificare direttamente dalla tua app:

const hbjs = require('handbrake-js')

hbjs.spawn({ input: 'something.avi', output: 'something.m4v' })
  .on('error', err => {
    // invalid user input, no video found etc
  })
  .on('progress', progress => {
    console.log(
      'Percent complete: %s, ETA: %s',
      progress.percentComplete,
      progress.eta
    )
  })

Quello che volevo io era però un’automazione del tutto! Nel senso che ogni tot di tempo volevo che nodejs controllasse se nella cartella ci fossero file AVI e li convertisse di conseguenza.
Tutto ciò che avevo da fare era solo incollare nella cartella il file in questione e lasciare poi che node facesse il resto.
Sicuramente è uno script da migliorare ma mi sono molto divertito a scriverlo e a vedere il risultato.

Lo script: Vediamolo nel dettaglio


const fs = require('fs');
const path = require('path');
const hbjs = require('handbrake-js');
const EXTENSION = '.avi';
const videoFolder = `${__dirname}/[cartella_dove_hai_messo_i_tuoi_video]/`;

let setter = false;
let timer = setInterval(function(){conversione()}, 190000);

function deleteMovie() {
    fs.readdir(path.resolve(videoFolder), (err, files) => {
        files.forEach(file => {
            if (path.extname(file) === EXTENSION) {
                fs.unlink(`${testFolder}${file}`, function(err) {
                    if (err) throw err;
                    console.log('File AVI deleted!');
                });
            }
        });
    });
};

function conversione() {
    fs.readdir(path.resolve(videoFolder), (err, files) => {
        files.forEach(file => {
            if (path.extname(file) === EXTENSION) {
                let outputNameFile = file.replace(/\.[^/.]+$/, "");
                hbjs.spawn({ input: `${videoFolder}${file}`, output: `${videoFolder}${outputNameFile}.mp4` })
                    .on('error', err => {
                        console.log(err);
                    })
                    .on('progress', progress => {
                        setter = true;
                        if(setter==true){clearInterval(timer)};
                        console.log(`Percent complete: ${progress.percentComplete}%, ETA: ${progress.eta}`);
                    })
                    .on('complete',  () =>  {
                        setter = false;
                        deleteMovie();
                        setInterval(function(){conversione()}, 190000);
                    });
            } else {
                console.log("In attesa di qualcosa da convertire...");
            };
        });
    });
};

timer;

Lo script richiama innanzitutto le librerie necessarie: fs, path ed handbrake.
E’ composto poi da due funzioni. La prima conversione() è quella su cui è attivo il setInterval. Ogni 3 minuti viene richiamata questa funzione.
L’fs legge il contenuto del path e se trova dei file che corrispondono ad EXTENSION avvia handbrake. Handbrake ha dei metodi interessanti che ci tornano molto utili : “on progress e “on complete“.
Il primo oltre a farci vedere in video come procede la conversione utilizza un trigger per mettere in pausa il setInterval.
Altrimenti durante la conversione verrebbe richiamata la funzione conversione() in un loop infinito!!!
L’altro metodo “on complete” si attiva al completamento della conversione da parte di handbrake. Quando handbrake completa la conversione mette in false il trigger cancella il file avi vecchio che è inutile e riavvia il setInterval su conversione().

Conclusioni


Non ti resta che provare il tutto. Io come in questo altro script ho demonizzato il tutto con systemctl e reso automatico l’avvio sul server.
E’ sempre in ascolto e appena arriva un avi lo converte dopo un tot di minuti di pausa che servono anche per attendere che il file venga trasferito completamente sulla cartella.
Tu puoi sbizzarirti come meglio credi creando anche un portale o una webapp da cui invii il file e fai apparire a video una barra di caricamento.
Handbrake-JS funziona anche con file MKV.

GiustinoRomano.IT – I do IT with my Heart.




Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *