diff --git a/doc/14_ReRender_roadmap.md b/doc/14_ReRender_roadmap.md index 349baa9..93e1c77 100644 --- a/doc/14_ReRender_roadmap.md +++ b/doc/14_ReRender_roadmap.md @@ -1,206 +1,240 @@ -# 📦 Re-Render & Compress +# 📦 Re-Render & Compress (H.264) + +> Status: **Entwurf / noch nichts implementiert.** Alle Zahlen unten sind +> Hypothesen, bis sie auf dem Host gemessen sind (siehe Phase 0). ## Problem -Der aktuelle Video-Stream (insbesondere 1080p MJPEG) erzeugt **sehr hohe Datenraten (~30 MBit/s)**. -Das führt zu Problemen bei: +MJPEG überträgt jedes Frame als vollständiges JPEG → die Bandbreite skaliert +linear mit Auflösung × Framerate × Clients. Bei höheren Auflösungen oder mehreren +gleichzeitigen Clients kann das im WAN / mobil teuer werden. -- mobiler Nutzung (Bandbreite / Datenvolumen) -- mehreren gleichzeitigen Clients -- schwachen Netzwerken +⚠️ **Wichtig – aktuelle Realität prüfen, nicht annehmen:** +Die Live-Streams laufen derzeit auf **320×240** (`liveSize` pro Kamera in +[cameras.json](../cameras.json)), **nicht** 1080p. Das `1920x1080` dort ist die +**`hiresSize`** — also das *Einzelbild* beim HD-Knopf bzw. im Snapshot-Modus, kein +Dauerstream. Die oft zitierten „~30 MBit/s" gelten also bestenfalls für einen +hypothetischen 1080p-Dauerstream, nicht für den heutigen Betrieb. + +👉 Bevor hier irgendwas gebaut wird, gilt **Phase 0: messen**. Ohne belastbare +Bandbreiten-Zahl ist unklar, ob sich der ganze Umbau überhaupt lohnt. ## Ziel -Reduktion der Bandbreite durch **optionale Hardware-basierte Neukodierung**: +Reduktion der Bandbreite durch **optionale, pro Kamera schaltbare** Neukodierung +MJPEG → H.264 (GPU), **ohne** die schlanke Default-Architektur (Node besitzt die +Kameras, MJPEG-Passthrough, ``-Viewer) für den LAN-Fall aufzugeben. -- Eingangsformat: MJPEG (von der Webcam) -- Zielformat: H.264 (deutlich effizienter) - -👉 Zielbitrate: ~2–5 MBit/s bei vergleichbarer wahrgenommener Qualität +Zielbitrate (Hypothese): ~2–5 MBit/s bei vergleichbarer wahrgenommener Qualität. --- -## Lösungsansatz +## ⚠️ Der eigentliche Knackpunkt zuerst: Wiedergabe im Browser -Zwei Betriebsmodi sollen flexibel unterstützt werden: +Das ist der Teil, der den Umbau groß macht — und der im ersten Entwurf als +„UI-Checkbox" verharmlost war. -### 1. 🟢 Unkomprimierter Modus (Default) -- MJPEG bleibt unverändert -- minimale Latenz -- keine GPU-Abhängigkeit +Der aktuelle Viewer rendert den Stream in einem **``** +([public/viewer.js](../public/viewer.js)), gespeist aus +`multipart/x-mixed-replace` ([src/snapshotService.js](../src/snapshotService.js)). +Ein `` kann **ausschließlich MJPEG** darstellen. + +> **H.264 läuft niemals in einem ``.** „Der Browser soll mit beidem umgehen" +> ist daher kein Schalter, sondern ein **zweiter, vollständiger Wiedergabe-Pfad.** + +H.264 + MJPEG schließen sich auch im Transport gegenseitig aus — H.264 lässt sich +nicht in MJPEG-multipart verpacken. Es braucht einen eigenen Container und einen +eigenen Player. Optionen: + +| Transport | Client | Aufwand | Latenz (Erwartung, zu messen) | +|-----------|--------|---------|-------------------------------| +| **MSE (fMP4)** | `