9.5 KiB
9.5 KiB
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:
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:
- 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 abgebrochenMEDIA_ERR_NETWORK(2) - NetzwerkfehlerMEDIA_ERR_DECODE(3) - DekodierungsfehlerMEDIA_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:
{
"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)
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
#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 Endeerror- Video-Fehler (mit Error Code)stalled- Buffering (Video hängt)waiting- Waiting for dataplaying- Video spielt abcanplay- 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:
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:
- Memory-Leak → Check Memory-Logs
- Video zu groß → Komprimieren
- Netzwerkprobleme → Check Network-Logs
- 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:
- Video-Format prüfen (MP4 H.264?)
- Video-Pfad prüfen (erreichbar?)
- Video neu encodieren
- Watchdog springt automatisch zum nächsten
Problem: Video buffert ständig
Check in Logs:
[WARNING] Video stalled (buffering)
[WARNING] Video waiting (buffering)
Lösung:
- Netzwerkverbindung prüfen
- Video-Bitrate reduzieren
- Preload auf 'metadata' (bereits implementiert)
- Video komprimieren
Problem: Hohe Speicherauslastung
Check in Logs:
[WARNING] Hohe Speicherauslastung (85%)
Lösung:
- Videos komprimieren
- Playlist verkleinern
- Präventiver Reload (bereits aktiv nach 6h)
- 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