# 📦 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
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.
⚠️ **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, 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.
Zielbitrate (Hypothese): ~2–5 MBit/s bei vergleichbarer wahrgenommener Qualität.
---
## ⚠️ Der eigentliche Knackpunkt zuerst: Wiedergabe im Browser
Das ist der Teil, der den Umbau groß macht — und der im ersten Entwurf als
„UI-Checkbox" verharmlost war.
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)** | `