Erfassen Sie den RTSP-Stream von der IP-Kamera und speichern Sie ihn

17

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

Lokaler Zugriff auf die URL über VLC: rtsp: //192.168.0.21: 554 / mpeg4

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

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

BEARBEITEN: Das NAS ist kopflos (HP N55L oder so) und die RaspberryPi's sind auch kopflos.

Ich habe bereits in ZoneMinder gesucht, brauche aber etwas Kleines. Ich hatte gehofft, Motion verwenden zu können, um Bewegungen im Stream zu erkennen, aber das wird später kommen.

Keerthi
quelle
Warum nicht VLC für Linux verwenden?
LatinSuD
1
Hoppla, ich habe vergessen zu erwähnen, dass sowohl der FreeNAS-Server als auch der RaspberryPi kopflos sind!
Sie können VLC über die Befehlszeile verwenden. Nicht trivial, aber möglich.
LatinSuD
Da es sich bei RTSP nur um ein Protokoll handelt, wird dann nur der h264-Inhalt ausgegeben, oder muss ich VLC veranlassen, ihn zu transkodieren?
1
Nun, das ist ein Teil des VLC-Befehlszeilen-Voodoos. Tut mir leid, deshalb gebe ich Ihnen hier keine vollständige Antwort. Ich denke, eine vollständige Umcodierung ist nicht erforderlich, aber vielleicht den Container ändern. Ich hoffe, dass hier ein VLC-Experte auftaucht.
LatinSuD

Antworten:

28

IP-Kameras sind von unterschiedlicher Qualität, einige verhalten sich meiner Erfahrung nach unregelmäßig. Der Umgang mit ihren RTSP-Streams erfordert eine Dosis Fehlertoleranz.

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

Um beispielsweise das RTSP-Audio / Video einer Kamera in Dateien im QuickTime-Format (auch AVI und MP4 verfügbar) zu speichern, muss alle 15 Minuten eine Datei erstellt werden:

$ 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 führt dazu, dass openRTSP stattdessen standardmäßig UDP verwendet, was den Netzwerkverkehr etwas reduzieren kann. Sie müssen mit den Optionen spielen, 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 der Steckdose gar nicht so ungewöhnlich ist.

Manchmal erkennt der openRTSP-Client diese Störungen nicht. Daher habe ich mich dafür entschieden, einen Controller in Python mit dem Modul 'subprocesses' zu codieren, um die Standardausgabe jeder openRTSP-Clientinstanz aufzurufen und zu überwachen und um zu überprüfen, ob die Dateien weiterhin an Größe zunehmen.

Dies scheint ein Nebenprodukt des unteren Bereichs der Videoüberwachungsbranche zu sein, der schnell und locker mit Standards spielt, wobei RTSP und ONVIF die beiden am häufigsten missbrauchten sind.

Glücklicherweise können Sie diese Probleme normalerweise umgehen. Verwenden Sie ONVIF nur für die einmalige Erkennung und Verwaltung von Einstellungen, es sei denn, Ihre IP-Kameras und der Controller sind so konzipiert, dass sie gut zusammenspielen.

Ich benutze openRTSP auf ein paar Raspberry Pi B + mit Raspbian. Jeder 1280x1024-Stream belegt ungefähr 8-10% der CPU-Zeit, und ich habe erfolgreich bis zu acht Kameras pro RPi ausgeführt und die Dateien in den NAS-Speicher geschrieben. Ein anderes RPi verarbeitet fertige Dateien mit ffmpeg, sucht nach Bewegungen und erzeugt Index-PNGs dieser Frames, um das Erkennen von Einbrüchen zu unterstützen.

Es gibt einen Open-Source-Versuch namens ZoneMinder, der diesen letzteren Teil erledigt, aber ich konnte ihn nicht mit meinen Kameras zum Laufen bringen. Die ONVIF-Unterstützung ist neu und in ZM im Entstehen begriffen, und sie scheint mit den fleckigen RTSP-Streams, die meine Menagerie von IP-Kameras unter 100 US-Dollar produziert, nicht gut zurechtzukommen.

Kevin-Prichard
quelle
Tolle Lösung Kevin, könnten Sie bitte mehr mit Motion Search / PNG-Indizierungslösung teilen - zumindest, wo Sie weiter graben können?
Igor
@ Kevin-Prichard Ich wollte verstehen, 1. Wenn ich sagen könnte Analog SD CVSB in IP Stream konvertieren würde deine Lösung funktionieren? (Ich möchte mp4-Videos in 1-Stunden-Abschnitten von jeder Quelle aufnehmen.) Und könnte ich 300 solcher Streams rund um die Uhr über ein einziges Netzwerk aufzeichnen oder würde dies das Netzwerk überlasten? 2. Ist es möglich, analoges SD / CVSB in IP-Stream umzuwandeln?
CP3O,
7

Ich dachte nur, ich würde meine zwei Cent hinzufügen und Björns Antwort ergänzen.

Anstatt einen Cron-Job auszuführen, um den VLC-Prozess regelmäßig abzubrechen, könnte man VLC anweisen, für eine bestimmte Zeitspanne auszuführen und anschließend zu schließen.

Dies ist der Befehl, den ich auf meiner Box 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

Dadurch wird VLC für die angegebene Zeit ausgeführt und später beendet. Der Parameter vlc: // quit ist erforderlich, da VLC die Aufzeichnung beenden und geöffnet bleiben würde. Dieser Befehl muss in einer Schleife platziert werden.

Das einzige Problem, das ich bisher festgestellt habe, ist, dass es bei jedem Start einer neuen Aufnahme einige Sekunden dauern kann.

Juanpi
quelle
7

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"

Dadurch sollte das Video in Abschnitten von 300 Sekunden gespeichert werden. (Beachten Sie, dass die Länge des Clips von Ihren Eingangs- und Ausgangsbildraten abhängt.)

Aldo
quelle
5

VLC scheint ein idealer Kandidat für die Verarbeitung Ihres Streams zu sein. Grundlegende Methoden zum Erfassen eines Streams sind auf der Videolan-Website beschrieben. Ich habe die Ausgabe meiner D-Link DCS-5222-Netzwerkkamera mit dem folgenden Befehl erfolgreich aufgezeichnet:

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

In Ihrem Fall funktioniert dies möglicherweise, 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 auszuführen, das diesen vlc-Prozess beendet und alle 30 Minuten eine neue Instanz startet, da ich nicht sicher bin, ob VLC dazu in der Lage ist.

Wenn Sie auf einem NAS speichern möchten, hängen Sie ihn einfach in Ihr lokales Dateisystem ein.

BjornR1989
quelle
1
Sie können FFMPEG auch verwenden, um genau den gleichen Job auszuführen. Sie müssen Ihr NAS weiterhin wie in der Antwort angegeben einbinden.
Kinnectus