Acquisisci stream RTSP dalla telecamera IP e memorizza


18

Ho alcune telecamere IP che producono un flusso RTSP (h264 mpeg4).

Colpire l'URL localmente tramite VLC: rtsp: //192.168.0.21: 554 / mpeg4

Posso eseguire lo streaming della videocamera e scaricare su disco (sul mio desktop). Vorrei tuttavia archiviare questi file sul mio NAS (FreeNAS). Stavo cercando dei modi per catturare il flusso RTSP e scaricarli su disco ma non sono riuscito a trovare nulla.

È possibile catturare lo streaming su FreeBSD o Linux (RaspberryPi) e scaricare il contenuto trasmesso su un disco locale su Linux o FreeBSD - preferibilmente ogni 30 minuti?

EDIT: Il NAS è senza testa (HP N55L o qualcosa del genere) e anche i RaspberryPi sono senza testa.

Ho già esaminato ZoneMinder ma ho bisogno di qualcosa di piccolo. Speravo forse di usare Motion per rilevare il movimento sullo stream, ma che verrà dopo.


Perché non usare VLC per Linux?
LatinSuD

1
oops, ho dimenticato di dire che sia il server FreeNAS che RaspberryPi sono senza testa!

È possibile utilizzare VLC dalla riga di comando. Non banale, ma possibile.
LatinSuD

Poiché RTSP è solo un protocollo, scaricherà semplicemente il contenuto di h264 o devo ottenere VLC per transcodificarlo?

1
Bene, questo fa parte del voodoo della riga di comando di VLC, e scusa è per questo che non ti sto dando una risposta completa qui. Penso che non sia necessaria una transcodifica completa, ma forse cambiare il contenitore. Spero che qualche esperto di VLC si presenti qui.
LatinSuD

Risposte:


29

Le telecamere IP sono di qualità variabile, alcune si comportano in modo irregolare nella mia esperienza. La gestione dei flussi RTSP richiede una dose di tolleranza agli errori.

Il progetto Live555 fornisce un'implementazione client RTSP relativamente tollerante ai guasti, openRTSP, per l'estrazione di flussi audio / video RTSP tramite CLI: http://www.live555.com/openRTSP/

Ad esempio, per salvare l'audio / video RTSP di una fotocamera su file in formato QuickTime (disponibili anche AVI e MP4), un file ogni 15 minuti:

$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11

Queste opzioni significano:

-D 1 # Quit if no packets for 1 second or more
-c   # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q   # Produce files in QuickTime format
-Q   # Display QOS statistics 
-F cam_eight  # Prefix output filenames with this text
-d 28800      # Run openRTSP this many seconds
-P 900        # Start a new output file every -P seconds
-t            # Request camera end stream over TCP, not UDP
-u admin 123456  # Username and password expected by camera
rtsp://192.168.1.108:554/11  # Camera's RTSP URL

La rimozione dell'opzione -t comporta invece l'impostazione predefinita di UDP di openRTSP, che può ridurre un po 'il traffico di rete. Dovrai giocare con le opzioni per trovare la combinazione più adatta a te.

Francamente, le telecamere stesse a volte sono inaffidabili, o semplicemente implementate in modo diverso, come chiudere improvvisamente la presa non è poi così insolito.

A volte il client openRTSP non rileva questi problemi. Quindi ho scelto di codificare un controller in Python usando il modulo 'sottoprocessi' per invocare e monitorare lo stdout di ogni istanza client openRTSP, e anche controllare che i file continuino a crescere di dimensioni.

Questo sembra essere un sottoprodotto della fascia bassa del settore delle TVCC che gioca veloce e sciolto con gli standard, RTSP e ONVIF sono i due più abusati.

Fortunatamente, di solito è possibile aggirare questi problemi. A meno che le telecamere IP e il controller non siano tutti progettati per funzionare bene insieme, utilizzare ONVIF solo per il rilevamento e la gestione delle impostazioni una sola volta.

Uso openRTSP su alcuni Raspberry Pi B + con Raspbian. Ogni flusso 1280x1024 occupa circa l'8-10% del tempo della CPU e ho eseguito con successo fino a otto telecamere per RPi, scrivendo i file nella memoria NAS. Un altro RPi elabora i file completati con ffmpeg, cercando il movimento e producendo indici PNG di quei frame, per aiutare a individuare le irruzioni.

C'è uno sforzo open source chiamato ZoneMinder che fa quest'ultima parte, ma non sono riuscito a farlo funzionare con le mie macchine fotografiche. Il supporto ONVIF è nuovo e nascente in ZM, e non sembra contendersi bene con gli spot RTSP chiazzati prodotti dal mio serraglio di telecamere IP con meno di $ 100.


Ottima soluzione Kevin, potresti condividere di più con la soluzione di indicizzazione motion search / png - almeno dove approfondire?
Igor,

@ Kevin-Prichard Volevo capire, 1. Se potessi convertire dire CVSB analogico SD in flusso IP la tua soluzione funzionerebbe? (Voglio catturare video mp4 in blocchi di 1 ora da ogni sorgente) E sarei in grado di registrare 300 di questi flussi su una singola rete 24/7 o questo sovraccaricherebbe la rete? 2. È possibile convertire SD / CVSB analogici in streaming IP?
CP3O,

7

Ho solo pensato di aggiungere i miei due centesimi e integrare la risposta di BjornR.

Invece di eseguire un cron job per terminare periodicamente il processo VLC, si potrebbe dire a VLC di funzionare per un determinato periodo di tempo e chiudersi in seguito.

Questo è il comando che eseguo sulla mia scatola:

/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit

Questo esegue VLC per il periodo di tempo specificato e successivamente esce. Il parametro vlc: // quit è obbligatorio poiché VLC interrompe la registrazione e rimane aperto. Questo comando deve essere inserito in un loop.

L'unico problema che ho riscontrato finora è che potrebbe perdere alcuni secondi ogni volta che inizia una nuova registrazione.


7

Se seguo correttamente la tua domanda, perché non provi il seguente comando su un sistema Linux (RPi):

ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"

Questo dovrebbe salvare il video in pezzi di 300 secondi. (Notare che la lunghezza della clip dipenderà dalla frequenza dei fotogrammi di input e output)


5

VLC sembra il candidato ideale per elaborare il tuo stream. I metodi di base per acquisire un flusso sono descritti sul sito Web di Videolan. Ho registrato correttamente l'uscita della mia telecamera di rete D-Link DCS-5222 usando il comando seguente:

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

Nel tuo caso, questo potrebbe funzionare per salvare l'output localmente:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

Suggerirei di eseguire uno script che termina questo processo di vlc e lanciare una nuova istanza ogni 30 minuti poiché non sono sicuro che VLC sia in grado di farlo.

Per quanto riguarda l'archiviazione su un NAS, è sufficiente montarlo sul file system locale.


1
È inoltre possibile utilizzare FFMPEG per fare esattamente lo stesso lavoro. Sarà comunque necessario montare il NAS come suggerisce la risposta.
Kinnectus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.