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

RTSP-stream van IP-camera vastleggen en opslaan

Ik heb een paar IP Camera’s die een RTSP (h264 mpeg4) stream uitvoeren.

Als ik de URL lokaal via VLC aanklik: rtsp://192.168.0.21:554/mpeg4

kan ik de camera streamen en naar schijf dumpen (op mijn desktop). Ik zou deze bestanden echter willen opslaan op mijn NAS (FreeNAS). Ik was op zoek naar manieren om de RTSP stream te vangen en ze naar schijf te dumpen, maar ik kan niets vinden.

Is het mogelijk om de stream op FreeBSD of Linux (RaspberryPi) op te vangen en de gestreamde inhoud naar een schijf lokaal bij Linux of FreeBSD te dumpen - bij voorkeur elke 30minuten?

EDIT: De NAS is headless (HP N55L of zoiets) en de RaspberryPi’s zijn ook headless.

Ik heb al gekeken naar ZoneMinder, maar ik heb iets kleins nodig. Ik hoopte misschien Motion te gebruiken om beweging op de stream te detecteren, maar dat komt later wel.

Antwoorden (4)

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

IP camera’s zijn van wisselende kwaliteit, sommige gedragen zich onregelmatig naar mijn ervaring. Het omgaan met hun RTSP streams vereist een dosis fout-tolerantie.

Het Live555 project biedt een relatief fouttolerante RTSP client implementatie, openRTSP, voor het ophalen van RTSP audio/video streams via CLI: http://www.live555.com/openRTSP/

Bijvoorbeeld, om de RTSP audio/video van een camera op te slaan in bestanden in QuickTime formaat (AVI en MP4 zijn ook beschikbaar), één bestand elke 15 minuten:

$ 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

Deze opties betekenen:

-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

Het verwijderen van de -t optie zorgt ervoor dat openRTSP standaard op UDP overschakelt, wat het netwerkverkeer een beetje kan verminderen. U zal met de opties moeten spelen om de combinatie te vinden die u bevalt.

Eerlijk gezegd zijn de camera’s zelf soms onbetrouwbaar, of gewoon anders geïmplementeerd -zoals het onverwacht sluiten van de socket is niet zo ongewoon.

Soms vangt de openRTSP client deze glitches niet op. Dus heb ik ervoor gekozen om een controller in Python te coderen die de ‘subprocesses’ module gebruikt om de stdout van elke openRTSP client instantie aan te roepen en te monitoren, en ook te controleren of de bestanden in grootte blijven groeien.

Dit lijkt een bijproduct te zijn van de low-end van de CCTV-industrie die snel en losjes met standaarden speelt, waarbij RTSP en ONVIF de twee meest misbruikte zijn.

Gelukkig kun je meestal om deze problemen heen werken. Tenzij uw IP-camera’s en controller allemaal ontworpen zijn om prettig samen te werken, gebruikt u ONVIF alleen voor eenmalige ontdekking en instellingenbeheer.

Ik gebruik openRTSP op een paar Raspberry Pi B+ met Raspbian. Elke 1280x1024 stream neemt ongeveer 8-10% van de tijd van de CPU in beslag, en ik heb met succes tot acht camera’s per RPi gedraaid, waarbij de bestanden naar NAS opslag werden geschreven. Een andere RPi verwerkt de voltooide bestanden met ffmpeg, zoekt naar beweging en produceert index PNGs van die frames, om te helpen bij het opsporen van inbrekers.

Er is een open-source initiatief genaamd ZoneMinder dat dit laatste deel doet, maar ik was niet in staat om het werkend te krijgen met mijn camera’s. ONVIF ondersteuning is nieuw en ontluikend in ZM, en het lijkt niet goed overweg te kunnen met de vlekkerige RTSP streams die geproduceerd worden door mijn menagerie van onder de $100 IP camera’s.

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

Als ik je vraag goed begrijp, waarom probeer je dan niet het volgende commando op een Linux systeem (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"

Dit zou de video moeten opslaan in stukjes van 300 seconden. (Merk op dat de lengte van de clip zal afhangen van uw input en output frame rates)

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

Ik dacht dat ik zou mijn twee centen toe te voegen en BjornR’s antwoord aan te vullen.

In plaats van het uitvoeren van een cron job om periodiek te doden het VLC proces, kan men vertellen VLC te draaien voor een bepaalde hoeveelheid tijd en daarna te sluiten.

Dit is het commando dat ik op mijn box uitvoer:

/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

Dit laat VLC voor de opgegeven tijd lopen en sluit daarna af. De vlc://quit parameter is nodig omdat VLC zou stoppen met opnemen en open zou blijven. Dit commando moet in een lus worden geplaatst.

Het enige probleem dat ik tot nu toe heb gevonden is dat het een paar seconden kan missen iedere keer als een nieuwe opname start.

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

VLC lijkt een ideale kandidaat om je stream te verwerken Basismethodes om een stream op te nemen staan beschreven op de Videolan website. Ik heb met succes de output van mijn D-Link DCS-5222 netwerkcamera opgenomen met het volgende commando:

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

In uw geval, zou dit kunnen werken om de output lokaal op te slaan:

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

Ik stel voor om een script uit te voeren dat dit vlc proces beëindigt en elke 30 minuten een nieuwe instantie start, omdat ik niet zeker weet of VLC in staat is om dit te doen.

Wat betreft het opslaan op een NAS, mount het gewoon op je lokale bestandssysteem.