Files
appRobotWebcam/doc/14_ReRender_roadmap.md
2026-06-07 11:40:37 +02:00

207 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📦 Re-Render & Compress
## Problem
Der aktuelle Video-Stream (insbesondere 1080p MJPEG) erzeugt **sehr hohe Datenraten (~30 MBit/s)**.
Das führt zu Problemen bei:
- mobiler Nutzung (Bandbreite / Datenvolumen)
- mehreren gleichzeitigen Clients
- schwachen Netzwerken
## Ziel
Reduktion der Bandbreite durch **optionale Hardware-basierte Neukodierung**:
- Eingangsformat: MJPEG (von der Webcam)
- Zielformat: H.264 (deutlich effizienter)
👉 Zielbitrate: ~25 MBit/s bei vergleichbarer wahrgenommener Qualität
---
## Lösungsansatz
Zwei Betriebsmodi sollen flexibel unterstützt werden:
### 1. 🟢 Unkomprimierter Modus (Default)
- MJPEG bleibt unverändert
- minimale Latenz
- keine GPU-Abhängigkeit
- ideal im LAN / bei wenigen Clients
### 2. 🔵 Komprimierter Modus (optional)
- MJPEG → H.264 via GPU-Encoding
- drastisch reduzierte Bandbreite
- geeignet für:
- mobile Clients
- WAN-Zugriff
- mehrere parallele Streams
👉 **Wichtig:** Kompression muss pro Kamera konfigurierbar sein.
---
## Hardware-Bewertung
### 🖥️ Intel UHD 630 (Coffee Lake)
**Unterstützung:**
- VAAPI
- Quick Sync Video (H.264/H.265)
**Leistung:**
- 12 Streams stabil
- niedrige CPU-Auslastung bei aktivem VAAPI
**Einschränkungen:**
- ältere Hardware
- limitiert bei:
- hoher Bitrate
- vielen Clients
**Praxis:**
- 30 MBit MJPEG → stabil auf ~35 MBit H.264 reduzierbar
---
### 🖥️ AMD Radeon 680M (Rembrandt)
**Unterstützung:**
- VAAPI
- VCN 3.x Hardware Encoder
**Vorteile:**
- deutlich bessere Encoding-Performance
- höhere Effizienz
- gut geeignet für mehrere Streams
**Praxis:**
- mehrere parallele Re-Encodes in Echtzeit möglich
---
## Architektur-Entscheidung
- Encoding erfolgt **im Server (FFmpeg + GPU)**
- Kamera liefert weiterhin MJPEG
- Pipeline entscheidet dynamisch:
```
Camera (MJPEG)
FFmpeg
[ optional ]
H.264 Encoding (GPU)
Client
```
---
## Konfigurationsmodell
Pro Kamera:
-`stream`: an/aus
-`compress`: an/aus (neu)
Beispiel:
```json
{
"camera": "cam1",
"stream": true,
"compress": true
}
```
---
## Technische Integration
### 1. GPU in Docker verfügbar machen
- Unterstützung für:
- Intel (VAAPI: `/dev/dri`)
- AMD (ebenfalls VAAPI)
- dynamische Erkennung statt Hardcoding
---
### 2. FFmpeg-Pipeline erweitern
Aktuell:
- MJPEG → MJPEG (copy oder re-encode)
Neu:
- optionaler Pfad:
```bash
MJPEG → H.264 (h264_vaapi / h264_qsv)
```
---
### 3. Stream-Handling erweitern
- bestehende Logik (`camera_switch.js`) bleibt intakt
- Erweiterung:
- Encoding-Mode abhängig von `compress`
- neue FFmpeg-Args
---
### 4. UI erweitern
In `config.html`:
- Checkbox:
```
[ ] Compress Stream (H.264)
```
---
## Design-Prinzipien
- ✅ **Backward-compatible** (Default: kein Encoding)
- ✅ **Low latency bleibt möglich**
- ✅ **Hardware optional**
- ✅ **Pro Kamera steuerbar**
- ✅ **Minimal CPU overhead**
---
## Offene Punkte
- H.264 → Rückgabeformat:
- weiterhin MJPEG für Browser?
- oder direkt Stream (z.B. mpegts / WebRTC)?
>> das video soll entweder komprimiert oder unverändert zum browser kommen, je nachdem wie der Haken gesetzt ist. Der Browser soll mit beidem umgehen können.
- Latenz vs. Kompression:
- Encoding erhöht minimal die Verzögerung. Das muss getestet werden, deshalb die Option es unverändert zu lassen.
- Client-Kompatibilität:
- MJPEG: universell
- H.264: effizient, aber Wrapper nötig
Falls Browser das nicht unterstützt, wird die Darstellung schwarz. Dann kann die
Konfiguration "Kompression" abgeschaltet werden.
---
## nächste Schritte (ToDo)
1. ✅ GPU-Passthrough in Docker implementieren
2. ✅ FFmpeg-Encoding-Profil definieren (VAAPI / QSV)
3. ✅ `CameraSwitch` um Encoding-Modus erweitern
4. ✅ Config um `compress` erweitern
5. ✅ UI-Checkbox hinzufügen
6. 🔄 Tests mit:
- Intel UHD 630
- AMD 680M
7. 🔄 Bandbreite & CPU vergleichen