Streamaufzeichnung für rtmp/rtsp

In bestimmten Situationen reicht es nicht, dass eine Kamera nur bei Bewegung aufzeichnet oder kurze Clips auf der SD-Karte speichert. Gerade bei Tieren, Langzeitbeobachtungen oder Überwachungsprojekten möchte man manchmal durchgehend aufzeichnen – und das am besten stabil, übersichtlich und automatisiert, so machen wir es auch beim Projekt www.storchennest-fohrde.de.

Mit einem kleinen Shell-Script und einer JSON-Konfigurationsdatei habe ich eine Lösung gebaut, mit der sich beliebig viele RTMP- oder RTSP-Streams gleichzeitig aufzeichnen lassen – in Segmenten, die sich leichter verwalten, abspielen und löschen lassen.

Warum in Segmenten aufzeichnen?

Statt eine riesige Videodatei anzulegen, die mehrere Stunden umfasst (und bei Absturz oft unbrauchbar ist), wird der Stream in regelmäßigen Abständen – z. B. alle 5 Minuten – in einzelne Videodateien aufgeteilt. Das hat gleich mehrere Vorteile:

  • Im Fehlerfall geht nur das aktuelle Segment verloren
  • Einzelne Clips lassen sich gezielt löschen oder archivieren
  • Die Dateien sind sofort nutzbar und können z. B. ins Web eingebunden oder für Zeitraffer genutzt werden

Was kann das Script?

Das Aufzeichnungsscript liest eine streams.json-Datei ein und startet für jeden dort definierten Stream einen ffmpeg-Prozess zur Segmentierung. Unterstützt werden:

  • RTMP- und RTSP-Streams (automatische Protokollerkennung)
  • Segmentlänge pro Stream frei einstellbar (segment_time)
  • Zielordner je Stream
  • Automatische Löschung alter Dateien nach X Minuten (delete, optional)

Typische Anwendungsfälle

  • Tierbeobachtung oder Nistkastenkameras mit 24/7-Dokumentation
  • Streaming-Backups z. B. von YouTube Live Events

So funktioniert es

Du brauchst nur:

  • Eine Linux-Maschine (z. B. Raspberry Pi, VPS, NAS)
  • Installiertes ffmpeg und jq
  • Eine streams.json-Datei mit deinen Kamera-URLs und Einstellungen
  • Und das Script – fertig!

Das Ganze lässt sich natürlich auch per cron regelmäßig ausführen oder dauerhaft im Hintergrund betreiben.

Beispielhafte Konfiguration

Die Konfigurationsdatei streams.json könnte z. B. so aussehen:

[
  {
    "name": "storchennest",
    "url": "rtsp://kamera.local:554/stream1",
    "dir": "/var/www/html/record/storchennest",
    "segment_time": "00:05:00",
    "delete": 1440
  },
  {
    "name": "baumkamera",
    "url": "rtmp://streamserver/live/baum",
    "dir": "/var/www/html/record/baumkamera",
    "segment_time": "00:10:00"
  }
]

Der erste Stream wird also alle 5 Minuten in neue Dateien aufgeteilt, und Dateien, die älter als 1440 Minuten (24 Stunden) sind, werden automatisch gelöscht. Der zweite Stream verzichtet auf automatische Löschung.

Und hier unser eigentliches Script record_streams.sh

#!/bin/bash
#
# Aufzeichnung von RTMP/RTSP-Streams via ffmpeg
# Konfiguration erfolgt über streams.json

CONFIG_FILE="./streams.json"
LOGFILE="/var/log/stream_record.log"

# Tools prüfen
command -v jq >/dev/null 2>&1 || { echo "jq fehlt. Installiere es mit 'sudo apt install jq'."; exit 1; }
command -v ffmpeg >/dev/null 2>&1 || { echo "ffmpeg fehlt. Installiere es mit 'sudo apt install ffmpeg'."; exit 1; }

STREAM_COUNT=$(jq length "$CONFIG_FILE")

for (( i=0; i $OUTPUT" >> "$LOGFILE"

  # Aufnahme
  ffmpeg $EXTRA_OPTS -i "$URL" \
    -c:v copy \
    -f segment \
    -strftime 1 \
    -segment_time "$SEGMENT_TIME" \
    -segment_atclocktime 1 \
    -segment_format mp4 \
    -reset_timestamps 1 \
    "$OUTPUT" >> "$LOGFILE" 2>&1 &

  # Alte Dateien löschen (optional)
  if [[ -n "$DELETE_AFTER" && "$DELETE_AFTER" =~ ^[0-9]+$ ]]; then
    echo "$(date +%F\ %T) - Lösche alte Dateien in $DIR älter als $DELETE_AFTER Minuten" >> "$LOGFILE"
    find "$DIR" -type f -name '*.mp4' -mmin +"$DELETE_AFTER" -delete
  fi
done

0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x