b2in/public/_cabinet/VIDEO_OPTIMIZATION_README.md
2026-01-23 17:33:10 +01:00

368 lines
9.5 KiB
Markdown

# Cabinet Digital Signage - Video-Optimierung & Robustness
## 🔧 Problem
Nach einer gewissen Laufzeit wurden die Videos nicht mehr angezeigt (schwarzer Bildschirm), obwohl der Footer weiterhin funktionierte. Dies deutet auf Memory-Leaks oder einen fehlerhaften Video-Loop hin.
## ✅ Implementierte Lösungen
### 1. **Robuster Video-Cleanup** (Memory-Management)
#### Was wurde gemacht:
- **Explizites Video-Cleanup** vor jedem neuen Video:
```javascript
videoElement.pause();
videoElement.removeAttribute('src');
videoElement.load(); // Triggert Garbage Collection
```
- **100ms Delay** nach Cleanup, bevor neues Video geladen wird
- **Preload auf 'metadata'** gesetzt (statt 'auto') → weniger Memory-Verbrauch
#### Warum das hilft:
- Browser gibt Speicher des alten Videos frei
- Verhindert Memory-Leaks bei langen Laufzeiten
- Reduziert gleichzeitig geladene Video-Daten
### 2. **Video Watchdog** (Überwachung)
#### Was wurde gemacht:
- **Watchdog läuft alle 5 Sekunden**
- Prüft ob Video noch läuft (vergleicht `currentTime`)
- Erkennt wenn Video "stecken bleibt"
- Automatischer Skip zum nächsten Video nach 2x "stuck"
#### Was wird überwacht:
```javascript
- currentTime (bewegt sich das Video?)
- isPaused (ist Video pausiert?)
- hasEnded (ist Video zu Ende?)
- isStuck (currentTime ändert sich nicht)
```
#### Warum das hilft:
- Erkennt frozen Videos automatisch
- Verhindert dass Display hängen bleibt
- Selbstheilende Funktion ohne manuellen Eingriff
### 3. **Start-Timeout** (10 Sekunden)
#### Was wurde gemacht:
- Timeout von 10 Sekunden für Video-Start
- Falls Video nicht innerhalb von 10s startet → Skip zum nächsten
- Timeout wird geclearet wenn Video erfolgreich startet
#### Warum das hilft:
- Verhindert endloses Warten bei defekten Videos
- Display bleibt nicht schwarz wenn Video nicht lädt
- Automatische Recovery
### 4. **Error Recovery** (Fehlerbehandlung)
#### Was wurde gemacht:
- **Automatischer Skip** bei Video-Fehlern
- **Consecutive Error Tracking** (zählt aufeinanderfolgende Fehler)
- **Max 3 aufeinanderfolgende Fehler** → dann Page-Reload nach 30s
- **Error-Logging** mit detaillierten Media Error Codes
#### Error Codes:
- `MEDIA_ERR_ABORTED` (1) - Video-Laden abgebrochen
- `MEDIA_ERR_NETWORK` (2) - Netzwerkfehler
- `MEDIA_ERR_DECODE` (3) - Dekodierungsfehler
- `MEDIA_ERR_SRC_NOT_SUPPORTED` (4) - Format nicht unterstützt
#### Warum das hilft:
- Display recovered automatisch von Fehlern
- Verhindert dass ein defektes Video alles blockiert
- Bei wiederholten Problemen: Komplett-Neustart
### 5. **Memory-Monitoring** (Performance-Überwachung)
#### Was wurde gemacht:
- **Memory-Check alle 10 Minuten**
- Loggt Speicherverbrauch in MB und Prozent
- **Warnung bei >80% Speicherauslastung**
- Loggt Video-Buffer-Status
#### Beispiel-Log:
```json
{
"message": "Memory Status",
"context": {
"usedMB": 245,
"limitMB": 512,
"percentUsed": 48
}
}
```
#### Warum das hilft:
- Frühzeitiges Erkennen von Memory-Problemen
- Daten für Troubleshooting und Optimierung
- Proaktives Monitoring statt reaktives Debugging
### 6. **Präventive Maßnahmen**
#### A) Präventiver Page-Reload (alle 6 Stunden)
```javascript
setTimeout(() => {
location.reload();
}, 6 * 60 * 60 * 1000);
```
- Verhindert Memory-Leaks über sehr lange Laufzeit
- Fresh Start alle 6 Stunden
- Erfolgt automatisch im Hintergrund
#### B) Critical Error Check (alle 30 Sekunden)
- Überwacht kritische Zustände
- Bei 3 kritischen Fehlern → Reload nach 5s
- Selbstheilende Funktion
#### C) CSS Performance-Optimierungen
```css
#video-player {
will-change: transform;
transform: translateZ(0);
backface-visibility: hidden;
}
```
- Aktiviert Hardware-Beschleunigung
- Reduziert Rendering-Last
- Optimiert für Video-Playback
### 7. **Erweiterte Video-Events**
#### Neue Events die geloggt werden:
- `ended` - Video zu Ende
- `error` - Video-Fehler (mit Error Code)
- `stalled` - Buffering (Video hängt)
- `waiting` - Waiting for data
- `playing` - Video spielt ab
- `canplay` - Video kann abgespielt werden
#### Warum das hilft:
- Vollständige Transparenz über Video-Status
- Erkennen von Buffering-Problemen
- Debuggen von Playback-Issues
## 📊 Monitoring & Debugging
### Was wird jetzt geloggt:
#### Erfolgreiche Events:
```
✅ Video cleanup durchgeführt
✅ Video started: video1.mp4
✅ Video läuft wieder normal
✅ Playlist-Loop abgeschlossen, starte von vorne
```
#### Warnungen:
```
⚠️ Video scheint stecken geblieben zu sein
⚠️ Hohe Speicherauslastung (85%)
⚠️ Video stalled (buffering)
⚠️ Überspringe zum nächsten Video
```
#### Fehler:
```
❌ Video start timeout (10s überschritten)
❌ Video definitiv stuck - starte nächstes
❌ Video Error: MEDIA_ERR_NETWORK
❌ Kritischer Zustand erkannt
```
### Log-Analyse:
#### Beispiel 1: Memory-Problem
```
[INFO] Memory Status: 420MB / 512MB (82%)
[WARNING] Hohe Speicherauslastung
→ Action: Beobachten, evtl. Videos optimieren
```
#### Beispiel 2: Stuck Video
```
[WARNING] Video scheint stecken geblieben (2x)
[ERROR] Video definitiv stuck - starte nächstes
[WARNING] Überspringe zum nächsten Video: watchdog_stuck
→ Action: Watchdog hat Recovery durchgeführt ✓
```
#### Beispiel 3: Netzwerkprobleme
```
[ERROR] Video Error: MEDIA_ERR_NETWORK
[WARNING] Überspringe zum nächsten Video: error_MEDIA_ERR_NETWORK
[INFO] Video started: video2.mp4
→ Action: Netzwerk kurz unterbrochen, automatisch recovered ✓
```
## 🎯 Best Practices für Videos
### 1. **Video-Format**
- **Container:** MP4 (H.264 + AAC)
- **Codec:** H.264 (High Profile, Level 4.0)
- **Audio:** AAC, 128-256 kbps
- **Auflösung:** Max 1920x1080 (Full HD)
- **Framerate:** 25 oder 30 fps
- **Bitrate:** 5-10 Mbps (nicht höher!)
### 2. **Video-Länge**
- **Optimal:** 15-60 Sekunden
- **Maximum:** 2-3 Minuten
- **Warum:** Kürzere Videos = weniger Memory-Verbrauch
### 3. **Dateigrößen**
- **Optimal:** 10-50 MB pro Video
- **Maximum:** 100 MB pro Video
- **Warum:** Schnelleres Laden, weniger Buffering
### 4. **Playlist-Größe**
- **Optimal:** 5-10 Videos
- **Maximum:** 20 Videos
- **Warum:** Übersichtlich, nicht zu viel Content im Loop
### 5. **Video-Optimierung**
Nutze Tools wie:
- **FFmpeg** für Re-Encoding
- **HandBrake** für Kompression
- **Adobe Media Encoder** für Profis
#### FFmpeg Beispiel:
```bash
ffmpeg -i input.mp4 \
-c:v libx264 -preset slow -crf 23 \
-c:a aac -b:a 128k \
-vf scale=1920:1080 \
-movflags +faststart \
output.mp4
```
## 🔍 Troubleshooting
### Problem: Videos werden nach einiger Zeit schwarz
#### Mögliche Ursachen:
1. **Memory-Leak** → Check Memory-Logs
2. **Video zu groß** → Komprimieren
3. **Netzwerkprobleme** → Check Network-Logs
4. **Browser-Cache voll** → Wird jetzt automatisch gecleart
#### Lösung:
- ✅ Implementiert: Automatischer Cleanup
- ✅ Implementiert: Watchdog erkennt Problem
- ✅ Implementiert: Automatischer Skip/Recovery
- ✅ Implementiert: Präventiver Reload nach 6h
### Problem: Video startet nicht
#### Check in Logs:
```
[ERROR] Video start timeout
[ERROR] Video play failed: MEDIA_ERR_SRC_NOT_SUPPORTED
```
#### Lösung:
1. **Video-Format prüfen** (MP4 H.264?)
2. **Video-Pfad prüfen** (erreichbar?)
3. **Video neu encodieren**
4. **Watchdog springt automatisch zum nächsten**
### Problem: Video buffert ständig
#### Check in Logs:
```
[WARNING] Video stalled (buffering)
[WARNING] Video waiting (buffering)
```
#### Lösung:
1. **Netzwerkverbindung prüfen**
2. **Video-Bitrate reduzieren**
3. **Preload auf 'metadata'** (bereits implementiert)
4. **Video komprimieren**
### Problem: Hohe Speicherauslastung
#### Check in Logs:
```
[WARNING] Hohe Speicherauslastung (85%)
```
#### Lösung:
1. **Videos komprimieren**
2. **Playlist verkleinern**
3. **Präventiver Reload** (bereits aktiv nach 6h)
4. **Browser-Cache leeren** (manuell)
## 📈 Performance-Metriken
### Empfohlene Werte:
- **Memory Usage:** < 70% des Heap-Limits
- **Video Start Time:** < 2 Sekunden
- **Buffering Events:** < 1 pro Stunde
- **Consecutive Errors:** 0
- **Watchdog Interventions:** < 1 pro Tag
### Critical Werte (Action required):
- **Memory Usage:** > 85%
- **Video Start Time:** > 10 Sekunden (Timeout!)
- **Buffering Events:** > 5 pro Stunde
- **Consecutive Errors:** ≥ 3
- **Watchdog Interventions:** > 10 pro Tag
## 🚀 Testing
### 1. **Test im Browser**
```
1. Öffne https://cabinet.b2in.eu
2. Öffne Developer Tools (F12)
3. Console Tab öffnen
4. Logs beobachten:
- "Video cleanup durchgeführt"
- "Video started: ..."
- Memory-Status nach 30s
```
### 2. **Stress-Test**
```
1. Lass Display 24h laufen
2. Check Logs auf Probleme
3. Memory-Status nach 24h prüfen
4. Watchdog-Interventionen zählen
```
### 3. **Network-Test**
```
1. Simuliere schlechte Verbindung (DevTools → Network → Throttling)
2. Beobachte Error-Recovery
3. Check ob automatischer Skip funktioniert
```
### 4. **Memory-Test**
```
1. Lass Display 6h laufen
2. Check Memory-Logs alle 10 Min
3. Sollte < 70% bleiben
4. Nach 6h: automatischer Reload
```
## 📋 Changelog
### Version 1.3 (2026-01-19)
- ✅ Video-Cleanup vor jedem neuen Video
- ✅ Video Watchdog (5s Interval)
- ✅ Start-Timeout (10s)
- ✅ Error Recovery mit Consecutive Error Tracking
- ✅ Memory-Monitoring (alle 10 Min)
- ✅ Präventiver Reload (alle 6h)
- ✅ Critical Error Check (alle 30s)
- ✅ CSS Performance-Optimierungen
- ✅ Erweiterte Video-Events (playing, canplay, waiting)
- ✅ Detaillierte Error-Codes mit Logging
---
**Status:** ✅ Ready for Production
**Tested on:** Chrome 120+ / Android 11+
**Last Update:** 2026-01-19