Passa ai contenuti principali

Codifica video con Vlc





Vlc è uno strumento Open Source in grado di svolgere molteplici funzioni nell'ambito della codifica/decodifica video. Se lo usate solo come player video ... non siete nel posto giusto.

Qui lo uso per implementare un servizio di decodifica di video stream in uno scenario, credo, presente in molte situazioni reali.

Scenario

- una o più sorgenti video in stream (in questo caso si concretizzeranno in servizi di streaming rstp implementati da un nvr)
- l'esigenza di ottenere il flusso video in una pagina web per meglio integrarlo in una applicazione personalizzata di videosorveglianza con interfaccia web
- poter bilanciare il tutto in funzione della banda a disposizione

Tutto si traduce in una differenza di protocolli per la gestione dello stream video: l'rstp o qualunque altro protocollo di gestione dello stream video non è gestibile direttamente dall'HTTP che è un protocollo sostanzialmente diverso.

Soluzione

Le soluzioni, che riscontrerete usando qualunque interfaccia web per la configurazione del vostro impianto di videosorveglianza "ibrido" (che gestisce sorgenti sia analogiche CCTV che telecamere IP), richiedono l'installazione di un activex usato per rendere in HTTP il flusso video proveniente dalle telecamere. Questi activix oltre a legare l'interfaccia ad uno specifico browser sono ormai non compatibili con i moderni browser oltre ad essere poco sicuri.

La soluzione che vi presento prevede che Vlc prenda lo stream RTSP, lo codifichi in modo da non pesare troppo sulla nostra rete e sul server usato per la decodifica (peso che potremo bilanciare potendo intervenire su tutti i parametri di codifica per non sforzare troppo la cpu e non saturare la banda della rete locale o geografica che intendiamo utilizzare) e lo converta in uno stream HTTP gestibile con un browser qualsiasi e una riga di codice HTML:






Prototipo

Lato server:

cvlc 'rtsp://IPNVR:554/user=USERNAME&password=PASSWORD&channel=1&stream=0.sdp?' :network-caching=1000 :sout='#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100} :http{mux=ogg,dst=:8181/cam1}' :sout-all :sout-keep

cvlc : è il comando in Linux per eseguire vlc senza interfaccia grafica
IPNVR : è l'IP dell'NVR.
USERNAME, PASSWORD : le credenziali per accedere al servizio



Lato client client:

<html>
<head></head>
<body>
<video id="video" src="http://localhost:8181/cam1" type="video/ogg; codecs=theora" autoplay="autoplay"/> Il tuo browser non supporta il video tag.
</body>
</html>

(per i dettagli sui parametri di vlc e per le istruzioni html...cercate su google)


Produzione

Per una situazione reale, dove le sorgenti sono più d'una, è indispensabile avere un servizio che parallelamente codifichi più flussi contemporaneamente e li renda su un servizio unico.
La soluzione VLC la fornisce con una configurazione mediante il servizio VLM.
Il nostro scenario ora prevede 5 telecamere: le 4 collegate all'nvr come l'esempio precedente e una ip cam.
Nell'esempio sotto di configurazione si può notare la quinta cam che ha ip IPIPCAM.

Setup di VLM:

# VLC media player VLM command batch
# http://www.videolan.org/vlc/


new cam1 broadcast enabled

setup cam1 input "rtsp://IPNVR:554/user=USERNAME&password=PASSWORD&channel=1&stream=1.sdp?"
setup cam1 output "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=0.0.0.0:9181/cam1}"
setup cam1 option sout-all
setup cam1 option network-caching=1000
setup cam1 option sout-keep
control cam1 play

new cam2 broadcast enabled

setup cam2 input "rtsp://IPNVR:554/user=USERNAME&password=PASSWORD&channel=2&stream=1.sdp?"
setup cam2 output "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=0.0.0.0:9181/cam2}"
setup cam2 option sout-all
setup cam2 option network-caching=1000
setup cam2 option sout-keep
control cam2 play

new cam3 broadcast enabled

setup cam3 input "rtsp://IPNVR:554/user=USERNAME&password=PASSWORD&channel=3&stream=1.sdp?"
setup cam3 output "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=0.0.0.0:9181/cam3}"
setup cam3 option sout-all
setup cam3 option network-caching=1000
setup cam3 option sout-keep
control cam3 play

new cam4 broadcast enabled

setup cam4 input "rtsp://IPNVR:554/user=USERNAME&password=PASSWORD&channel=4&stream=1.sdp?"
setup cam4 output "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=0.0.0.0:9181/cam4}"
setup cam4 option sout-all
setup cam4 option network-caching=1000
setup cam4 option sout-keep
control cam4 play

new cam5 broadcast enabled

setup cam5 input "http://USERNAME:PASSWORD@IPIPCAM/cgi-bin/getimage.cgi?motion=1"
setup cam5 output "#transcode{vcodec=theo,vb=800,acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=0.0.0.0:9181/cam5}"
setup cam5 option sout-all
setup cam5 option network-caching=1000
setup cam5 option sout-keep
control cam5 play


Per eseguire cvlc con un file di configurazione basta lanciare:

cvlc --vlm-conf videosrv.vlm

Per quanto riguarda invece il codice html ... bhè non vorrei offendere la vostra intelligenza mostrandovelo.


Il risultato ora è questo:




Tutti i parametri sono bilanciabili per caricare poco sulla cpu con la codifica e sulla rete con il traffico.

Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.

Commenti

Posta un commento

Post popolari in questo blog

Telecamere Ip con accesso "nascosto"

Telecamere Ip con accesso "nascosto" Storia triste di un auto-hacking obbligato che mi ha fatto scoprire come la nostra privacy è realmente messa a rischi. Storia Ho acquistato dal mercatino/fiera del Radioamatore di Fasano quattro telecamere IP. La scatola riporta "Smart Camera" LF4810. Ne ho montata una e testata in tutte le sue funzionalità per oltre un mese. Chiaramente la manualistica scarsissima, come da tradizione in questi prodotti cinesi di costo molto concorrenziale, consiste in un "pieghevole" di 4 facciate. Chiaramente non erano documentate le impostazioni necessarie per attivare i protocolli ONVIF e RTSP che mi sono indispensabili per l'uso che ne devo fare. Nonostante questa scarsa documentazione dopo l'installazione base fatta con l'apposita app: tutto sembrava corretto. Chiaramente la prima azione che ho compiuto è stata quella di cambiare la password che di default è "123". Subito dopo h...

Dynamic DNS con Duckdns.org in HTTPS

Obiettivo Avere un dominio https con certificato valido da usare come endpoint pubblico per Homeassistant e per un WebHook per i bot telegram. Fase 1 Registrazione del dominio in un servizio di dynamic DNS come https://www.duckdns.org/   : Scegliere per quale sistema operativo installare il client che si occuperà dell'aggiornamento dell'ip: Seguire la semplice guida per la configurazione del processo cron: Fase 2 Creazione del certificato e installazione sul server. Di tutto questo si occuperà una applicazione che si chiama certbot. $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt install python-certbot-apache $ sudo certbot --apache -d ol3.duckdns.org -d www.ol3.duckdns.org Fase 3 Esporre il servizio https sulla rete pubblica. Aprire o reindirizzare la porta 443 verso l'host sul quale si è fatta la configurazione di certbot dal proprio router. Il certificato di certbot è valido per novanta giorn...

JHipster - Uso base

Cosa è JHipster è un "generatore di applicazioni" che fornisce tutto lo stack necessario ad implementare una applicazione web e/o a microservizi basata su Spring Boot e AngularJs. E' dotato di un marketplace di componenti già pronte: https://www.jhipster.tech/#modules E' dotato di uno strumento web per la modellazione dello schema E-R: https://start.jhipster.tech/jdl-studio/ Prerequisiti - Java 8  - Node.js (usare la versione LTS 64-bit) - NPM viene installato con Node.js ma va aggiornato      $ npm install -g npm - Per usare il JHipster Marketplace, installare Yeoman:       $ npm install -g yo Uso base Gli step, presi dal sito ufficiale sono questi: 1. Installare JHipster:       $ npm install -g generator-jhipster Nota: per installare una versione specifica del generator:   $ npm install -g generator-jhipster@6.0.5 2. Crea una nuova directory ed entra dentro questa:   $ mkdir ...