RTSP Kamera – 24/7 Aufnahme auf Festplatte

Das hier genannte Script basiert auf dem Script linux-nvr von gokce-keskin. Ich habe es nur für meine Bedürfnisse angepasst.

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 installCode-Sprache: JavaScript (javascript)

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))
Code-Sprache: PHP (php)

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 {} \;Code-Sprache: JavaScript (javascript)

Stumpf per crontab -e jeden Tag, z.B. um Mitternacht, ausführen lassen:

0 0 * * * /backup/delete-old.shCode-Sprache: JavaScript (javascript)

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.cnfCode-Sprache: JavaScript (javascript)

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
Code-Sprache: JavaScript (javascript)

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.

Kategorien:Linux