RTSP Kamera – 24/7 Aufnahme auf Festplatte
Wir haben eine Platte, die unter /backup gemountet ist (Altlast, das Gerät war vorher ein Backup-Server). Auf der Platte speichern wir ein Python-Script, welches alle 10 Minuten neu den RTSP-Stream abgreift, und die Videos.
Ebenfalls lassen wir per Cronjob alte Backups (älter als X Tage) automatisiert löschen.
Vorbereitende Installation
Vorher müssen wir openRTSP installieren. Das regelt folgende Befehle:
apt-get install -y build-essential g++
cd /usr/src
wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz
tar -xzf live555-latest.tar.gz
cd live
./genMakefiles linux
make
make install
Das solls gewesen sein. Der Befehl openRTSP
sollte nun funktionieren.
record.py
Das Python-Script erstellt im CWD einen Ordner für die entsprechende Kamera. Anzupassen sind die RTSP-Streams, die Kamerabezeichnungen sowie die Höhe und Breite des Streames (zu finden unter -w 2592 -h 1944
)
'''
Simple recorder for cheap IP cameras using openRTSP
Usage:
Record camera1's footage in 600 second chunks
python record.py --camera camera1 --record-period 600
'''
import subprocess
import time
import os
import signal
import argparse
import datetime
parser = argparse.ArgumentParser()
parser.add_argument("--camera", type=str, default="door",
help="Camera (camera1 or camera2)")
parser.add_argument("--record-period", type=int, default=600,
help="Output file size in seconds")
args = parser.parse_args()
common =' -4 -B 10000000 -b 10000000 -f 20 -w 2592 -h 1944 -t -V'
if args.camera == "camera1":
end = 'rtsp://username:[email protected]:554/Streaming/Channels/101'
elif args.camera == "camera2":
end = 'rtsp://username:[email protected]:554/11'
common = common + ' -d %d ' % args.record_period
# Create the output directory
outdir = './%s/' % args.camera
os.system('mkdir -p %s' % outdir)
def return_filename():
# Creates a filename with the start time
# of recording in its name
fl = time.ctime().replace(' ', '_')
fl = fl.replace(':', '_')
return fl
while True:
# Anpassung: für jeden Tag ein neues Verzeichnis erstellen
basepath = '%s/%s' % (outdir, datetime.date.today())
os.system('mkdir -p %s' % basepath)
outfile = './%s/%s.mp4' % (basepath, return_filename())
# Create the openRTSP command and its parameters
cmd = 'openRTSP ' + common + end
cmd = cmd.split(' ')
cmd = [ix for ix in cmd if ix != '']
st = time.time()
with open(outfile,"wb") as outp:
proc = subprocess.Popen(cmd, shell=False,
stdin=None, stdout=outp,
stderr=None, close_fds=True)
time.sleep(args.record_period)
# Send the termination signal
print('Send termination signal')
proc.send_signal(signal.SIGHUP)
time.sleep(1)
os.kill(proc.pid, signal.SIGTERM)
print('Elapsed %1.2f' % (time.time() - st))
Das Script wird dann mit python ./record.py --camera camera1
gestartet. Damit es durchgehend läuft, zum Beispiel via screen
.
delete-old.sh
Folgendes Shell-Script löscht alte Verzeichnisse und Ordner:
#!/bin/bash
find /backup/driveway/* -mtime +7 -exec rm -rf {} \;
Stumpf per crontab -e
jeden Tag, z.B. um Mitternacht, ausführen lassen:
0 0 * * * /backup/delete-old.sh
chmod
nicht vergessen.
Zugriff via Windows
Nun wollen wir Zugriff via Windows. Aus Sicherheitsgründen nur lesend; warum sollte man die Aufnahmen auch löschen, macht das Script doch automatisch?
Das funktioniert über das Programm samba
apt-get install -y samba
nano /etc/samba/smb.cnf
In der Datei fügen wir folgende Sachen unten an:
[camera1]
path = /backup/camera1/
public = no
writable = no
comment = Kamera 1
printable = no
guest ok = no
Wir starten mit folgendem Befehl den Samba-Dienst neu:
systemctl restart samba
Und erlauben dem Benutzer tino Zugriff via Samba, bzw. vergeben auch ein Kennwort:
smbpasswd -a tino
Anpassen der Berechtigungen im Verzeichnis:
chmod 0777 /backup/camera1
Und beim Zugriff via Explorer unter Windows sollten die einzelnen Ordner sichtbar sein.
Resultat
Nach unseren Anpassungen sehen wir in unserer Freigabe (in diesem Beispiel „driveway“ statt „camera1“) für jedes Datum einen Ordner, und in diesem Unterordner für alle 10 Minuten eine Datei.