4.0 KiB
Roadmap – Dynamische Kamera-Konfiguration (config.html)
Ziel: Live-Auflösung pro Kamera zur Laufzeit umschalten, ohne Datei-Editor oder Container-Restart.
Kontext
Alle drei Kameras (C270, C920, C922) unterstützen dieselben MJPEG-nativen Auflösungen:
| Auflösung | Pixel | Faktor ggü. 640×480 |
|---|---|---|
| 160×120 | 19'200 | −96% |
| 320×240 | 76'800 | −83% |
| 640×360 | 230'400 | −53% (16:9) |
| 640×480 | 307'200 | Referenz (aktuell) |
| 800×600 | 480'000 | +56% |
| 1280×720 | 921'600 | +200% |
Nur MJPEG-native Auflösungen verwenden – sonst fällt V4L2 auf YUYV (unkomprimiert) zurück und FFmpeg muss software-encoden (~50% CPU pro Kamera).
Priorität: Latenz > CPU > Bildqualität. Bandbreite ist der Engpass beim Internet-Zugriff.
Geplante UI: /config.html
Separate Admin-Seite (kein Viewer-Umbau nötig). Pro Kamera eine Zeile:
┌─────────────────────────────────────────────────────┐
│ Kamera-Konfiguration │
├──────────┬────────────┬──────────┬──────────────────┤
│ cam0 │ Kamera 0 │ [320×240 ▼] │ Live: 320×240│
│ cam1 │ Kamera 1 │ [640×360 ▼] │ Live: 640×360│
│ cam2 │ Kamera 2 │ [Aus ▼] │ Live: aus │
├──────────┴────────────┴──────────┴──────────────────┤
│ [Speichern & Neu starten] │
└─────────────────────────────────────────────────────┘
ComboBox-Optionen pro Kamera:
Aus→ Stream deaktivieren (stream: false)160×120320×240640×360640×480(aktuell Default)800×6001280×720
Implementierung
Phase 1 – API-Endpunkt (server.js / neues Modul)
GET /api/config → liefert aktuelle Konfiguration aller Kameras:
{
"cameras": [
{ "id": "cam0", "liveSize": "320x240", "stream": true },
...
]
}
POST /api/config → nimmt neue Konfiguration entgegen:
{
"cameras": [
{ "id": "cam0", "liveSize": "640x360", "stream": true },
{ "id": "cam1", "liveSize": "320x240", "stream": true },
{ "id": "cam2", "stream": false }
]
}
Ablauf im Handler:
- Validierung (nur erlaubte Auflösungen akzeptieren)
cameras.jsonaktualisieren- Pro geänderter Kamera: Live-FFmpeg stoppen (
_killCurrentAndWait) + mit neuen Params neu starten (_spawnLive) – kein Container-Restart nötig
Phase 2 – config.html (statische Seite in /public)
- Liest beim Laden
GET /api/config - Zeigt pro Kamera ein
<select>mit den erlaubten Auflösungen [Speichern]→POST /api/config→ Erfolgsmeldung- Keine Authentifizierung (ist im internen Netz, wie der Viewer)
Phase 3 – Hot-Reload in CameraSwitch
Neue Methode reconfigure({ liveSize, stream }) in CameraSwitch:
- Wenn
stream: false→_killCurrentAndWait(), kein Neustart - Wenn
liveSizegeändert →_killCurrentAndWait()+this.liveSize = newSize+_spawnLive() - Wenn nichts geändert → no-op
Abgrenzung (nicht im Scope dieser Roadmap)
- MJPEG Re-Encode-Qualität (
-q:v) → separates Thema, eigene Env-Variable liveFpsper Kamera → triviale Erweiterung, analog zuliveSize- Authentifizierung auf
/config.html→ wenn Internet-Zugang geplant hiresSizeper Kamera (HD-Grab) → bereits in cameras.json, kein UI nötig
Manueller Test (sofort möglich, ohne diese Roadmap)
cameras.json direkt bearbeiten und Container neu starten:
{ "id": "cam0", ..., "liveSize": "320x240" }
Details: siehe unten im Gesprächsprotokoll / 09_Bug_reports.md.