Raspberry Pi mit Netzwerkwebcam verbinden und Zeitrafferaufnahmen erzeugen
Find a file
Dieter Lang c27021add8
All checks were successful
Go CI / build (push) Successful in 2m27s
24h-Video: MP4-Aufnahmen vor dem Zusammenfügen remuxen
2026-09-03 14:54:46 +02:00
.forgejo/workflows Development Release bei jedem Main-Build neu erzeugen 2026-09-03 10:30:11 +02:00
internal/version Go-Datei formatieren 2026-09-01 16:41:46 +02:00
.gitignore Lokalen Testaufbau aus Repository entfernen und Skript für Testaufbau verbessert 2026-09-03 11:21:56 +02:00
config.json.example Konfiguration und Docker-Umgebung aktualisieren 2026-09-02 20:18:03 +02:00
docker-compose.yaml Konfiguration und Docker-Umgebung aktualisieren 2026-09-02 20:18:03 +02:00
docker-compose.yaml.example Development Release auch ZIP erzeugen 2026-09-03 10:05:57 +02:00
dockerfile Konfiguration und Docker-Umgebung aktualisieren 2026-09-02 20:18:03 +02:00
go.mod 2026-05-12 07:58 Erstes Programmgerüst 2026-05-12 07:58:45 +02:00
LICENSE Initial commit 2026-08-31 17:30:31 +02:00
main.go 24h-Video: MP4-Aufnahmen vor dem Zusammenfügen remuxen 2026-09-03 14:54:46 +02:00
README.md Zeitraffer-Startzeit konfigurierbar machen 2026-09-01 17:34:43 +02:00
stoerung.jpg 2026-05-12 21:02 Version 0.5 2026-05-12 21:08:12 +02:00
webcam 24h-Video: MP4-Aufnahmen vor dem Zusammenfügen remuxen 2026-09-03 14:54:46 +02:00
webcam.service 2026-05-12 09:21 Version 0.1 2026-05-12 10:16:40 +02:00

webcam

Raspberry-Pi-Anwendung zur Anbindung einer Netzwerk-Webcam per RTSP. Das Programm stellt das aktuelle Kamerabild über eine Weboberfläche bereit, zeichnet Videos in einzelnen Zeitabschnitten auf und erzeugt aus gespeicherten Zeitrafferbildern Zeitrafferfilme.

Funktionen

  • Empfang des Kamerastreams über RTSP
  • aktuelles Kamerabild für die Weboberfläche
  • separates Bild für die Anzeige über das FRITZ!Fon
  • fortlaufende Videoaufnahmen
  • frei konfigurierbare Dauer der einzelnen Videoaufnahmen
  • regelmäßige Zeitraffer-Snapshots
  • Erstellung eines Zeitrafferfilms aus den Bildern des aktuellen Tages
  • Weboberfläche zur Anzeige und Verwaltung der Aufzeichnungen
  • Download und Löschen vorhandener Videoaufnahmen
  • Stoppen und Starten der Videoaufnahme über die Weboberfläche
  • erneutes Einlesen der config.json während des laufenden Betriebs
  • automatische Aufbewahrung und Bereinigung nach den konfigurierten Zeiträumen

Voraussetzungen

Die Anwendung ist für den Betrieb auf einem Raspberry Pi vorgesehen.

Benötigt werden:

  • Raspberry Pi mit Linux
  • Netzwerkzugriff auf die RTSP-Kamera
  • ffmpeg
  • eine passende Go-Buildumgebung für die Erstellung des Binaries

Das erzeugte ARM64-Binary wird über die Forgejo-CI erstellt und als Release bereitgestellt.

Projektstruktur

webcam/
├── config.json
├── docker-compose.yaml
├── go.mod
├── internal/
│   └── version/
│       └── version.go
├── LICENSE
├── main.go
├── README.md
├── stoerung.jpg
└── webcam.service

Konfiguration

Die Anwendung verwendet eine JSON-Konfigurationsdatei config.json.

Ein Beispiel:

{
    "rtsp_url": "rtsp://BENUTZER:PASSWORT@192.168.1.100:554/Streaming/Channels/101",
    "base_dir": "./data/kamera",
    "web_server_path": "./data/kamera/aktuell.jpg",
    "video_duration_sec": 1800,
    "snapshot_interval_min": 1,
    "keep_videos_days": 7,
    "keep_snapshots_days": 30,
    "web_listen_addr": ":8083",
    "web_listen_addr_local": ":8084",
    "web_user": "admin",
    "web_password": "admin",
    "timelapse_image_duration_sec": 5
}

Parameter

Parameter Beschreibung
rtsp_url RTSP-Adresse der Netzwerk-Webcam. Die URL kann Benutzername und Passwort enthalten.
base_dir Basisverzeichnis für die erzeugten Bilder und Videos.
web_server_path Pfad zum aktuellen Kamerabild, das von der Weboberfläche verwendet wird.
video_duration_sec Dauer einer einzelnen Videoaufnahme in Sekunden. Beispiel: 600 = 10 Minuten, 1800 = 30 Minuten.
snapshot_interval_min Abstand zwischen den Zeitraffer-Snapshots in Minuten.
keep_videos_days Anzahl der Tage, für die Videoaufnahmen aufbewahrt werden.
keep_snapshots_days Anzahl der Tage, für die Zeitraffer-Snapshots aufbewahrt werden.
web_listen_addr Adresse und Port des normalen Webservers, z. B. :8083.
web_listen_addr_local Adresse und Port des separaten lokalen Servers für das FRITZ!Fon-Bild, z. B. :8084.
web_user Benutzername für die Weboberfläche.
web_password Passwort für die Weboberfläche.
timelapse_image_duration_sec Anzeigedauer eines einzelnen Bildes im erzeugten Zeitrafferfilm in Sekunden.
timelapse_start_hour Stunde des täglichen Zeitpunkts für die automatische Zeitraffererstellung (023).
timelapse_start_minute Minute des täglichen Zeitpunkts für die automatische Zeitraffererstellung (059).

Sicherheit

Die config.json kann sensible Daten enthalten, insbesondere die Zugangsdaten der RTSP-Kamera.

Die lokale config.json wird deshalb nicht als Release-Asset veröffentlicht.

Für eine Veröffentlichung des Git-Repositories sollte darauf geachtet werden, dass keine echten Kamera-Zugangsdaten committed werden.

Videoaufnahmen

Die Anwendung erzeugt fortlaufend einzelne MP4-Dateien.

Die Länge einer Aufnahme wird mit video_duration_sec festgelegt.

Beispiele:

600 Sekunden  = 10 Minuten
1800 Sekunden = 30 Minuten
3600 Sekunden = 60 Minuten

Kürzere Aufnahmen sind ausdrücklich möglich und können sinnvoll sein, da dadurch kleinere einzelne MP4-Dateien entstehen.

Die erzeugten Dateien werden im konfigurierten Datenverzeichnis gespeichert.

Zeitraffer

Während des Betriebs werden in dem mit snapshot_interval_min festgelegten Abstand Bilder aufgenommen.

Mit der Funktion „Zeitraffer erstellen“ in der Weboberfläche wird aus den Zeitrafferbildern des aktuellen Tages ein Zeitrafferfilm erzeugt.

Die Dauer, mit der ein einzelnes Bild im Zeitrafferfilm angezeigt wird, wird mit timelapse_image_duration_sec festgelegt.

Die erzeugten Zeitrafferfilme werden anschließend wie die normalen Videoaufnahmen in der Weboberfläche angezeigt.

Die automatische tägliche Erstellung erfolgt zu der in timelapse_start_hour und timelapse_start_minute konfigurierten Uhrzeit. Standardmäßig ist dies 03:05 Uhr.

Weboberfläche

Die Weboberfläche ist standardmäßig unter Port 8083 erreichbar.

Die Startseite zeigt:

  • das aktuelle Kamerabild
  • die aktuelle Uhrzeit
  • den Aufnahmestatus
  • die verfügbaren Aufzeichnungen
  • die Bedienelemente zur Steuerung

Status

Der Status zeigt an, ob Daten von der Webcam empfangen werden.

AUFNAHME AKTIV bedeutet, dass die Aufnahme aktiv ist.

Video Stop / Start

Mit „Video Stop“ wird die laufende Videoaufnahme bzw. Übertragung beendet.

Mit „Video Start“ kann die Aufnahme wieder gestartet werden.

Zeitraffer erstellen

„Zeitraffer erstellen“ erstellt aus den Zeitrafferbildern des heutigen Tages einen Zeitrafferfilm.

Config neu laden

Mit „Config neu laden“ wird die config.json während des laufenden Betriebs erneut eingelesen.

Damit können Änderungen an der Konfiguration übernommen werden, ohne den Dienst vollständig neu zu starten.

Aufzeichnungen

Unterhalb des Kamerabildes werden die vorhandenen Aufzeichnungen angezeigt.

Die Liste enthält Zeitrafferfilme und die einzelnen Videoaufnahmen.

Für jede Datei stehen folgende Aktionen zur Verfügung:

  • Download Datei herunterladen
  • Löschen Datei löschen

Zusätzlich werden Dateiname und Dateigröße angezeigt.

Installation auf dem Raspberry Pi

1. Release herunterladen

Das Release enthält die für die Installation benötigten Dateien:

  • webcam-arm64
  • webcam-amd64
  • stoerung.jpg
  • webcam.service

Für einen Raspberry Pi mit ARM64-Betriebssystem wird webcam-arm64 verwendet.

Die Datei config.json ist kein Bestandteil des Releases und muss lokal auf dem Raspberry Pi erstellt bzw. angepasst werden.

2. Installationsverzeichnis vorbereiten

Das Binary und die Konfiguration werden entsprechend der vorhandenen Service-Datei installiert.

sudo mkdir -p /etc/webcam-service
sudo mkdir -p /etc/webcam-service/data

3. Binary installieren

Das ARM64-Binary aus dem Release wird als /usr/local/bin/webcam-service installiert:

sudo cp webcam-arm64 /usr/local/bin/webcam-service
sudo chmod +x /usr/local/bin/webcam-service

4. Konfiguration installieren

Die lokal erstellte config.json wird nach /etc/webcam-service/config.json kopiert:

sudo cp config.json /etc/webcam-service/config.json

Die RTSP-URL und die übrigen Parameter müssen an die lokale Umgebung angepasst werden.

5. Störungsbild installieren

Das Release enthält stoerung.jpg.

sudo cp stoerung.jpg /etc/webcam-service/stoerung.jpg

6. Service-Datei installieren

Die mit dem Release ausgelieferte webcam.service wird nach /etc/systemd/system kopiert:

sudo cp webcam.service /etc/systemd/system/webcam.service

Danach systemd neu laden:

sudo systemctl daemon-reload

7. Dienst aktivieren

Damit der Dienst beim Systemstart automatisch gestartet wird:

sudo systemctl enable webcam.service

8. Dienst starten

sudo systemctl start webcam.service

Status prüfen:

sudo systemctl status webcam.service

webcam.service

Die mitgelieferte Service-Datei verwendet:

[Unit]
Description=Go Webcam Management Service
After=network.target mnt-data.mount

[Service]
Type=simple
User=pi
Group=pi
WorkingDirectory=/etc/webcam-service
ExecStart=/usr/local/bin/webcam-service
Restart=always
RestartSec=10
KillMode=process
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

Der Dienst wird als Benutzer pi ausgeführt.

Das Arbeitsverzeichnis ist:

/etc/webcam-service

Das Programm wird aus:

/usr/local/bin/webcam-service

gestartet.

Betrieb und Logs

Den aktuellen Status des Dienstes anzeigen:

sudo systemctl status webcam.service

Die laufenden Meldungen anzeigen:

sudo journalctl -u webcam.service -f

Die letzten Meldungen anzeigen:

sudo journalctl -u webcam.service -n 100

Dienst neu starten:

sudo systemctl restart webcam.service

Dienst stoppen:

sudo systemctl stop webcam.service

Docker

Für den Betrieb in Docker steht docker-compose.yaml zur Verfügung.

Die Container-Konfiguration stellt den Webserver auf Port 8083 bereit und bindet den Kamera-Datenbereich ein.

Bei Änderungen an der Konfiguration muss darauf geachtet werden, dass die im Container verwendeten Pfade mit den Pfaden aus config.json übereinstimmen.

Versionsinformationen

Die Version wird nicht mehr aus einer lokalen Build-Datei übernommen.

Bei einem Forgejo-Release wird die Versionsnummer aus dem Git-Tag ermittelt.

Beispiel:

v0.9.1

wird im Programm als:

0.9.1

verwendet.

Zusätzlich werden beim CI-Build der kurze Git-Commit und das Build-Datum in das Binary eingebettet.

Diese Informationen werden beim Start des Webcam-Dienstes ausgegeben und in der Weboberfläche für die Versionsinformation verwendet.

Forgejo CI/CD

Der Build wird über den Forgejo-Workflow in .forgejo/workflows/ci.yml durchgeführt.

Der Workflow:

  1. checkt den ausgelösten Commit aus
  2. ermittelt die Versionsnummer aus dem Git-Ref bzw. Git-Tag
  3. ermittelt den Git-Commit
  4. ermittelt das Build-Datum
  5. prüft die Go-Formatierung
  6. führt go test ./... aus
  7. prüft die Go-Module
  8. baut das Linux-amd64-Binary
  9. baut das Linux-arm64-Binary
  10. veröffentlicht bei einem v*-Tag automatisch ein Forgejo Release

Ein normaler Push auf main führt den Build und die Tests aus, erstellt aber kein Release.

Ein Git-Tag nach dem Schema

v0.9.1

löst zusätzlich die automatische Release-Erstellung aus.

Release-Dateien

Ein Release enthält:

webcam-amd64
webcam-arm64
stoerung.jpg
webcam.service

Die lokale config.json wird nicht veröffentlicht.

Lizenz

Dieses Projekt steht unter der Lizenz GNU General Public License Version 3 oder später (GPL-3.0-or-later).

Siehe LICENSE.