2014-06-09 08:56:55 +0000 2014-06-09 08:56:55 +0000
18
18

Cattura il flusso RTSP dalla telecamera IP e memorizza

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

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

Posso trasmettere lo stream della telecamera e fare il dump su disco (sul mio desktop). Vorrei però memorizzare questi file sul mio NAS (FreeNAS). Stavo cercando un modo per catturare il flusso RTSP e scaricarlo su disco, ma non sono riuscito a trovare nulla.

È possibile catturare il flusso su FreeBSD o Linux (RaspberryPi) e scaricare il contenuto in streaming su un disco locale a 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à guardato ZoneMinder ma ho bisogno di qualcosa di piccolo. Speravo forse di usare Motion per rilevare il movimento sul flusso, ma questo verrà dopo.

Risposte (4)

30
30
30
2015-05-29 22:33:16 +0000

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

Il progetto Live555 fornisce un'implementazione del client RTSP relativamente tollerante ai guasti, openRTSP, per estrarre i flussi audio/video RTSP via CLI: http://www.live555.com/openRTSP/

Ad esempio, per salvare l'audio/video RTSP di una telecamera in 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

Rimuovendo l'opzione -t, openRTSP passa di default a UDP, il che può ridurre un po’ il traffico di rete. Dovrete giocare con le opzioni per trovare la combinazione che fa per voi.

Francamente, le telecamere stesse sono a volte inaffidabili, o semplicemente implementate diversamente - come la chiusura inaspettata del socket non è poi così insolita.

A volte il client openRTSP non cattura questi inconvenienti. Così ho optato per codificare un controller in Python usando il modulo ‘subprocessi’ per invocare e monitorare lo stdout di ogni istanza del client openRTSP, e anche controllare che i file continuino a crescere di dimensione.

Questo sembra essere un sottoprodotto della fascia bassa dell'industria CCTV che gioca veloce e sciolto con gli standard, RTSP e ONVIF sono i due più frequentemente abusati.

Fortunatamente, di solito è possibile aggirare questi problemi. A meno che le vostre telecamere IP e il controller siano progettati per giocare bene insieme, usate ONVIF solo per la scoperta e la gestione delle impostazioni una volta sola.

Io 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 su NAS. Un altro RPi elabora i file completati con ffmpeg, cercando il movimento e producendo indici PNG di quei fotogrammi, per aiutare a individuare le effrazioni.

C'è uno sforzo open-source chiamato ZoneMinder che fa quest'ultima parte, ma non sono riuscito a farlo funzionare con le mie telecamere. Il supporto ONVIF è nuovo e nascente in ZM, e non sembra affrontare bene i flussi RTSP discontinui prodotti dal mio serraglio di telecamere IP sotto i 100 dollari.

7
7
7
2017-06-26 12:49:23 +0000

Se ho seguito 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 da 300 secondi. (Nota che la lunghezza della clip dipenderà dai tuoi frame rate di ingresso e di uscita)

7
7
7
2015-04-01 22:52:30 +0000

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

Invece di eseguire un cron job per uccidere periodicamente il processo VLC, si potrebbe dire a VLC di funzionare per un determinato periodo di tempo e poi chiudere.

Questo è il comando che eseguo sulla mia macchina:

/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 tempo specificato e poi esce. Il parametro vlc://quit è necessario poiché VLC smetterebbe di registrare e rimarrebbe aperto. Questo comando deve essere inserito all'interno di un ciclo.

L'unico problema che ho trovato finora è che potrebbe perdere qualche secondo ogni volta che inizia una nuova registrazione.

5
5
5
2014-06-09 12:06:59 +0000

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

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 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, basta montarlo sul tuo file system locale.