fbpx

NodeJs e Videosorveglianza Onvif


20 Nov 2021 - Informatica, Software


NodeJs e Videosorveglianza Onvif

Utilizziamo NodeJS per la nostra videosorveglianza e registriamo lo streaming delle nostre telecamere Onvif sul nostro serverino

NodeJs e Videosorveglianza Onvif: Intro


E’ ormai appurato che NodeJs è potente, stabile, scalabile e chi più ne ha più ne metta!
Da quando l’ho scoperto mi sono divertito creando vai progettini che puoi trovare anche qui sul sito come ad esempio come convertire video oppure come creare delle API.
Utilizzarlo solo per le semplici Crud con MongoDB è una delle molteplici cose che può fare Node. Basta dare sfogo alla fantasia per creare qualsiasi cosa.
In questo caso mi era venuto in mente di creare un piccolo NVR per poter registrare il flusso streaming delle proprie telecamere ONVIF.

L’Onvif per chi non lo sapesse è un’organizzazione che si è preoccupata di standardizzare la compatibilità tra varie case produttrici di impianti di videosorveglianza basate sui protocolli di comunicazione IP.
In sostanza e detta in breve non acquistando un impianto di videosorveglianza con telecamere ip ed nvr non sei costretto a comprare tutti i pezzi della stessa casa produttrice per farli funzionare.

Uno dei protocolli utilizzati da queste telecamere è l’RTSP, ti lascio qui il link per maggiori informazioni : https://it.wikipedia.org/wiki/Real_Time_Streaming_Protocol.

In poche parole sfrutteremo questo protocollo e NodeJS per salvare lo streaming in una cartella.

Andiamo al dunque: Cosa ci serve?


Prerequisiti del sistema e Installazione Pacchetto

Il codice e tutto l’accrocchio non è molto complicato da capire ma può esserlo soprattutto se è la prima volta che hai a che fare con RTSP, ONVIF e robe del genere.
Per prima cosa ho installato NodeJS sulla mia macchina casalinga che monta semplicemente una versione di Ubuntu Server. Sarà tua premura installare anche ffmpeg con tutte le sue dipendenze. Sono i codec necessari affichè il tuo serverino possa riuscire a “vedere” le telecamere.
Ti lascio qui una guida per l’installazione : https://linuxize.com/post/how-to-install-ffmpeg-on-ubuntu-18-04/

Puoi anche scaricare da qui https://www.gyan.dev/ffmpeg/builds/ la versione per Windows. Scompatta il contenuto del pacchettino .7zip (https://www.7-zip.org/download.html) in C:\ e imposta il PATH nelle variabili di ambiente.

Non ti restarà che creare una directory entrarci e lanciare il canonico

npm init

per inizializzare la app e indicare l’entry point. Node ti suggerirà index.js se lasci quello ovviamente crea un file con quel nome ed estensione ed aprilo col tuo editor preferito. Naturalmente se hai creato già un file con un nome diverso è il momento buono per indicarlo a Node al posto di index.js.

Nella directory dove hai inizializzato la app lancia questo comando per scaricare i nodes-moludes necessari al funzionamento del tutto!

npm i node-onvif-recorder

Ultima cosa da fare prima di partire è procurarti il link rtsp per la generazione dello stream video.
Prima di tutto assicurati che ci sia il protocollo rtsp sulla tua telecamera facendo un nmap verso il suo indirizzo ip.

Se ricevi questo come output

PORT     STATE SERVICE
554/tcp  open  rtsp

sei a cavallo!


Di norma questi link sono composti in questo modo

rtsp://[nome_utente]:[password]@[ip]/[media]

Dove appunto [nome_utente] e [password] sono le credenziali per accedere alla videocamera. Nel caso in cui non è impostato alcuno basta non mettere niente e partire da [ip]:

rtsp://[ip]/[path]

Per quanto riguarda il [path] ogni modello ne ha uno diverso.

Puoi trovarli qui : https://www.ispyconnect.com/camera/sricam#.


Di norma però nella maggior parte dei casi ho sempre riscontrato che mpeg4 è il path che funziona con tutte.


Un esempio di come dovrebbe presentarsi questo link :

rtsp://admin:[email protected]/mpeg4

oppure

rtsp://192.168.1.80/mpeg4


Sei pronto! Apri il tuo editor preferito e inziamo a registrare!

NodeJS e Videosorveglianza Onvif Il codice


Alla fine non è niente di particolamente complicato. Qui puoi trovare la documentazione ufficiale del pacchetto : https://www.npmjs.com/package/node-onvif-recorder e copiando e incollando il codice proposto hai fatto ma volevo condividere con te il problema che ho riscontrato.
Tralaltro puoi trovare anche il codice per salvare solo gli screenshot! Usando un setInterval ne puoi lanciare uno ogni tot di tempo.

    const Recorder = require('node-onvif-recorder').Recorder
 
    var rec = new Recorder({
        url: 'rtsp://192.168.1.12:8554/unicast',
        timeLimit: 60, // time in seconds for each segmented video file
        folder: '/Users/sahilchaddha/Sahil/Projects/Github/node-rtsp-recorder/videos',
        name: 'cam1',
    })
    // Starts Recording
    rec.startRecording();
 
    setTimeout(() => {
        console.log('Stopping Recording')
        rec.stopRecording()
        rec = null
    }, 300000)

Modifica il codice in modo da farlo comunicare con la tua telecamera.
In particolare dovrai modificare l’url (esempio sotto):

url: 'rtsp://admin:[email protected]/mpeg4

ovviamente tu metti il tuo e la variabile folder che sarà il contenitore dei tuoi video registrati.
Ti consiglio di utilizzare

folder: './',

in quanto nel costruttore della classe RTSPRecorder che trovi nel file node_modules\node-onvif-recorder\src\helpers\recorder.js è richiamata la funzione file handler che crea automaticamente una cartella chiamata “record” al cui interno è presenta altre ulteriori cartelle in base al numero di videocamere (cam1, cam2, cam3…) e per ogni telecamera crea una ulteriore cartella in base alla data giornaliera.

const RTSPRecorder = class {
    constructor(config = {}) {
        this.config = config
        this.name = config.name
        this.url = config.url
        this.timeLimit = config.timeLimit || 60
        this.folder = config.folder + '/record' || 'media/'
        this.categoryType = config.type || 'video'
        this.directoryPathFormat = config.directoryPathFormat || 'MMM-Do-YY'
        this.fileNameFormat = config.fileNameFormat || 'YYYY-M-D-h-mm-ss'
        fh.createDirIfNotExists(this.folder)
        fh.createDirIfNotExists(this.getDirectoryPath())
        fh.createDirIfNotExists(this.getTodayPath())
    }
     

NodeJS e Videosorveglianza Onvif Un problema


Tutto qui? No!
Ho trovato un problema!
Quando lanciavo questo codice mi venivano generati dei file ma…erano tutti vuoti! ????

NodeJs e Videosorveglianza Onvif Immagine dei file con indicata la dimensione di essi cioè 0 kb

Smanettando ho trovato che il problema è nella modifica dell’estensione del file.
Devi modificare questo file node_modules\node-onvif-recorder\src\helpers\recorder.js
e modificare la funzione da così:

    getExtenstion() {
        if (this.categoryType === 'audio') {
            return '.avi'
        }
        if (this.categoryType === 'image') {
            return '.jpg'
        }

        return '.mp4'
    }

a così:

    getExtenstion() {
        if (this.categoryType === 'audio') {
            return '.avi'
        }
        if (this.categoryType === 'image') {
            return '.jpg'
        }

        return '.mov'
    }

Lanciando poi

$ node [nome_file].js

Noterai diversi console.log che ti indicheranno che la registrazione è partita. Il codice è programmato in modo tale che crei video da un minuto. Naturalmente se vuoi modificare questi parametri ti basterà modificare il codice.
Nello stesso file che ti ho indicato ci sono anche i console.log. Puoi modificarli traducendoli in italiano. Quelli di default sono in portoghese.

Conclusioni


Come puoi vedere con NodeJS si può fare davvero di tutto. Questo codice è un esempio. Come avrai potuto intuire è da perfezionare in quanto non è prevista nessun metodo di sovrascrittura dopo un determinato periodo di tempo o di saturazione del disco, ma se ti ingeni un pò e utilizzi i moduli fs di Node sicuramente un modo lo si trova.
Anzi..se lo trovi un modo lasciamelo pure scritto qui sotto!

GiustinoRomano.IT – I do IT with my Heart.




Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Translate Me



Contatti


         

About Me








Mi chiamo Giustino e sono un Tecnico Informatico, sono appassionato, tra le tante cose, di Reti e Web Design!
Clicca sul link e scopri di più




Leggi anche...