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

RTSP-Stream von IP-Kamera aufzeichnen und speichern

Ich habe ein paar IP-Kameras, die einen RTSP-Stream (h264 mpeg4) ausgeben.

Wenn ich die URL lokal über VLC aufrufe: rtsp://192.168.0.21:554/mpeg4

kann ich die Kamera streamen und auf die Festplatte (auf meinem Desktop) ausgeben. Ich würde diese Dateien jedoch gerne auf meinem NAS (FreeNAS) speichern. Ich habe nach Möglichkeiten gesucht, den RTSP-Stream zu erfassen und auf die Festplatte zu dumpen, aber ich kann nichts finden.

Ist es möglich, den Stream unter FreeBSD oder Linux (RaspberryPi) zu erfassen und den gestreamten Inhalt auf eine Festplatte lokal unter Linux oder FreeBSD zu dumpen - vorzugsweise alle 30Minuten?

EDIT: Das NAS ist headless (HP N55L oder so) und die RaspberryPi’s sind auch headless.

Ich habe bereits in ZoneMinder geschaut, aber ich brauche etwas kleines. Ich hatte gehofft, vielleicht Motion zu verwenden, um Bewegung auf dem Stream zu erkennen, aber das kommt später.

Antworten (4)

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

IP-Kameras sind von unterschiedlicher Qualität, einige verhalten sich meiner Erfahrung nach erratisch. Der Umgang mit ihren RTSP-Streams erfordert ein gewisses Maß an Fehlertoleranz.

Das Live555-Projekt bietet eine relativ fehlertolerante RTSP-Client-Implementierung, openRTSP, zum Abrufen von RTSP-Audio-/Videoströmen über CLI: http://www.live555.com/openRTSP/

Um beispielsweise das RTSP-Audio/Video einer Kamera in Dateien im QuickTime-Format (AVI und MP4 sind ebenfalls verfügbar) zu speichern, eine Datei alle 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

Diese Optionen bedeuten:

-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

Das Entfernen der Option -t bewirkt, dass openRTSP stattdessen UDP verwendet, was den Netzwerkverkehr ein wenig reduzieren kann. Sie werden mit den Optionen spielen müssen, um die für Sie passende Kombination zu finden.

Ehrlich gesagt, sind die Kameras selbst manchmal unzuverlässig oder einfach anders implementiert - wie das unerwartete Schließen des Sockets ist nicht so ungewöhnlich.

Manchmal fängt der openRTSP-Client diese Pannen nicht ab. Deshalb habe ich mich entschieden, einen Controller in Python zu programmieren, der das Modul ‘subprocesses’ verwendet, um das stdout jeder openRTSP-Client-Instanz aufzurufen und zu überwachen, und auch zu überprüfen, ob die Dateien weiter wachsen.

Dies scheint ein Nebenprodukt der CCTV-Industrie zu sein, die mit Standards spielt, wobei RTSP und ONVIF die beiden am häufigsten missbrauchten sind.

Glücklicherweise können Sie diese Probleme normalerweise umgehen. Sofern Ihre IP-Kameras und Ihr Controller nicht so konzipiert sind, dass sie gut zusammenspielen, sollten Sie ONVIF nur für die einmalige Erkennung und Verwaltung der Einstellungen verwenden.

Ich verwende openRTSP auf ein paar Raspberry Pi B+ mit Raspbian. Jeder 1280x1024-Stream beansprucht etwa 8-10% der CPU-Zeit, und ich habe erfolgreich bis zu acht Kameras pro RPi betrieben und die Dateien auf einen NAS-Speicher geschrieben. Ein anderer RPi verarbeitet die fertigen Dateien mit ffmpeg, sucht nach Bewegung und erzeugt Index-PNGs dieser Bilder, um bei der Erkennung von Einbrechern zu helfen.

Es gibt ein Open-Source-Projekt namens ZoneMinder, das diesen letzten Teil übernimmt, aber ich konnte es mit meinen Kameras nicht zum Laufen bringen. Die ONVIF-Unterstützung in ZM ist neu und im Entstehen begriffen, und es scheint nicht gut mit den sporadischen RTSP-Streams zurechtzukommen, die von meiner Menagerie von IP-Kameras unter 100 Dollar produziert werden.

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

Wenn ich Ihrer Frage richtig folge, warum versuchen Sie nicht den folgenden Befehl auf einem Linux-System (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"

Dies sollte das Video in Abschnitten von 300 Sekunden speichern. (Beachten Sie, dass die Länge des Clips von Ihrer Eingangs- und Ausgangsbildrate abhängt)

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

Ich dachte nur, ich würde meine zwei Cents hinzufügen und BjornRs Antwort ergänzen.

Anstatt einen Cronjob laufen zu lassen, um den VLC-Prozess regelmäßig zu beenden, könnte man VLC anweisen, für eine bestimmte Zeit zu laufen und sich danach zu schließen.

Dies ist der Befehl, den ich auf meinem Rechner ausführe:

/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

Dies lässt VLC für die angegebene Zeitspanne laufen und beendet sich danach. Der vlc://quit-Parameter ist erforderlich, da VLC die Aufnahme stoppen und geöffnet bleiben würde. Dieser Befehl muss innerhalb einer Schleife platziert werden.

Das einzige Problem, das ich bisher gefunden habe, ist, dass es jedes Mal, wenn eine neue Aufnahme startet, ein paar Sekunden verpassen könnte.

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

VLC sieht wie ein idealer Kandidat aus, um Ihren Stream zu verarbeiten Grundlegende Methoden zur Erfassung eines Streams sind auf der Videolan-Website beschrieben. Ich habe erfolgreich die Ausgabe meiner D-Link DCS-5222 Netzwerkkamera mit dem folgenden Befehl aufgezeichnet:

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

In Ihrem Fall könnte dies funktionieren, um die Ausgabe lokal zu speichern:

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

Ich würde vorschlagen, ein Skript laufen zu lassen, das diesen vlc-Prozess beendet und alle 30 Minuten eine neue Instanz startet, da ich mir nicht sicher bin, ob VLC dazu in der Lage ist.

Was das Speichern auf einem NAS betrifft, mounten Sie es einfach in Ihr lokales Dateisystem.