146ba6c399c1e6247a100e88870f7f2d559247df
Webcam
Zwei kleine Python-Tools für MJPEG-Kameras:
relay.py– holt den MJPEG-Stream jeder Kamera nur einmal ab und stellt ihn für beliebig viele Zuschauer per HTTP bereit (gedacht für den Betrieb hinter einem Reverse Proxy wie Zoraxy).webcam.py– Kommandozeilenwerkzeug, um einen MJPEG-Stream zu testen, Einzelbilder/Frames zu speichern oder live anzuzeigen.
Voraussetzungen
- Python 3
requests- Optional für
webcam.py --show:opencv-pythonundnumpy
pip install requests
pip install opencv-python numpy # nur für --show
Relay (relay.py)
Konfiguration
Die Konfiguration erfolgt über eine .env-Datei neben relay.py oder über Umgebungsvariablen (echte Umgebungsvariablen haben Vorrang).
cp .env.example .env
| Variable | Beschreibung | Standard |
|---|---|---|
CAMERA_<name> |
Stream-URL einer Kamera, eine Zeile pro Kamera. Der Name wird Teil der URL (/cam1/). |
– (mindestens eine nötig) |
PORT |
Port, auf dem der Relay lauscht | 8000 |
AUTH_USER / AUTH_PASS |
Optional: Basic-Auth. Nur sinnvoll mit HTTPS (z. B. in Zoraxy). | aus |
Beispiel:
CAMERA_cam1=http://192.168.1.8:8080/stream.mjpg
CAMERA_cam2=http://192.168.1.9:8080/stream.mjpg
PORT=8000
#AUTH_USER=benutzername
#AUTH_PASS=geheim
.enventhält ggf. Zugangsdaten – nicht ins Repository einchecken.
Starten
python3 relay.py
Als systemd-Dienst
webcam-relay.service liegt im Repository. Pfade und Benutzer (/home/joachim/git/webcam, joachim) bei Bedarf in der Datei anpassen.
Der Dienst nutzt das System-Python (/usr/bin/python3). Dort muss requests installiert sein, auch wenn es z. B. in Conda oder einem venv schon vorhanden ist:
sudo apt install python3-requests
sudo cp webcam-relay.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now webcam-relay
Status und Logs:
systemctl status webcam-relay
journalctl -u webcam-relay -f
Endpunkte
| Pfad | Beschreibung |
|---|---|
/ |
Web-Frontend: Übersicht aller Kameras |
/<name>/ |
Web-Frontend: große Ansicht einer Kamera, die anderen als Vorschau-Leiste |
/status.json |
Online-Status aller Kameras (wird vom Frontend alle 5 s abgefragt) |
/<name>/stream.mjpg |
Livestream (multipart/x-mixed-replace) |
/<name>/snapshot.jpg |
Aktuelles Einzelbild |
/stream.mjpg, /snapshot.jpg |
Alias für die erste Kamera (Abwärtskompatibilität) |
/health |
Status aller Kameras (200 wenn alle liefern, sonst 503); ohne Authentifizierung erreichbar |
Web-Frontend
Das Frontend liegt in frontend.html (reines HTML/CSS/JS, keine Abhängigkeiten) und wird vom Relay ausgeliefert. Änderungen an der Datei wirken sofort, ohne Neustart.
- Raster mit Live-Streams aller Kameras, Klick auf den Namen öffnet die große Ansicht
- Statuspunkt und Hinweis „Kamera offline“ pro Kamera, automatisches Neuverbinden
- Buttons für Foto (Download) und Vollbild
- Hell/Dunkel passend zum System
- Streams werden getrennt, solange der Tab im Hintergrund ist
- Alle Links sind relativ, daher funktioniert es auch unter einem Proxy-Prefix wie
/webcam/
Funktionsweise
- Pro Kamera läuft ein Hintergrund-Thread, der den Stream liest und die JPEG-Frames anhand der Marker
FFD8/FFD9ausschneidet. - Bei Verbindungsfehlern wird nach 3 Sekunden automatisch neu verbunden.
- Alle Zuschauer bekommen jeweils das neueste Frame – die Kamera wird unabhängig von der Zuschauerzahl nur einmal belastet.
- Der Header
X-Accel-Buffering: noverhindert Pufferung durch den Proxy.
Stream-Tool (webcam.py)
python3 webcam.py # Verbindung testen, Frame-Infos ausgeben
python3 webcam.py --snapshot bild.jpg # ein Einzelbild speichern
python3 webcam.py --save frames/ -n 50 # 50 Frames als JPEG speichern
python3 webcam.py --show # Live-Fenster (q oder Esc beendet)
python3 webcam.py --url http://IP:PORT/stream.mjpg
| Option | Beschreibung |
|---|---|
--url |
Stream-URL (Standard ist in webcam.py hinterlegt) |
--snapshot DATEI |
Ein Frame speichern und beenden |
--save ORDNER |
Frames im Ordner speichern |
-n N |
Nach N Frames beenden (0 = endlos) |
--show |
Live-Fenster anzeigen (OpenCV) |
Description
Ein Webserver mit python für ESP32-CAMs und Raspberry Pi Cam's
702 KiB
0 Stars
1 Watchers
0 Forks
Languages
Python
50.2%
HTML
49.8%