# AppRobotWebcam – Protokoll-Vergleich WebRTC ⟷ MJPEG ## Status - **Auflösung fest auf 640×480** → Latenz ist jetzt **„immer akzeptabel"** (vorher schwankend/träge). Das bestätigt: ein Teil der gefühlten Latenz kam von zu großen Frames im Browser (Decode + Render). Kleineres Bild = schnellerer Browser. - **Entscheid vorläufig: WebRTC** – skaliert besser über echtes Internet (NAT, mehrere User). - go2rtc bleibt die Basis → **http://thinkcentre.local:1984** bleibt jederzeit als Vergleichs- und Debug-Oberfläche verfügbar. > Der direkte Messvergleich WebRTC ⟷ MJPEG steht noch aus (Zeitgründen). > Diese Datei hält fest, **wie** man ihn nachholt. --- ## Warum überhaupt vergleichen? | Protokoll | Latenz (LAN, 480p) | Mechanik | Bandbreite | |-----------|--------------------|----------|------------| | **MJPEG** | am niedrigsten | Jedes Frame ein eigenständiges JPEG, kein Buffer, `` rendert sofort | hoch (jedes Frame voll) | | **WebRTC** | niedrig | H.264-Encode + Jitter-Buffer im Browser; dafür effiziente Kompression | niedrig | | **MSE** | mittel–hoch | Für VOD optimiert, größerer Puffer | niedrig | - **MJPEG** = theoretische Latenz-Untergrenze, aber bei mehr Usern / über Internet bandbreitenhungrig und ohne NAT-Traversal. - **WebRTC** = minimal mehr Latenz durch Encode/Buffer, dafür internet-tauglich (NAT-Traversal via STUN/TURN, geringe Bandbreite, mehrere User). Für **1–3 User im LAN** kann MJPEG gewinnen. Über **Internet** gewinnt WebRTC fast immer. --- ## So führst du den Vergleich durch go2rtc stellt jeden Stream über **mehrere** Protokolle bereit. Jeweils einzeln und direkt im Browser öffnen (für cam1: `cam0` → `cam1` ersetzen): | Modus | URL | Was es testet | |-------|-----|---------------| | **MJPEG roh** | `http://thinkcentre.local:1984/api/stream.mjpeg?src=cam0` | Untergrenze: reines Bild, kein Player, kein Buffer | | **WebRTC pur** | `http://thinkcentre.local:1984/webrtc.html?src=cam0` | WebRTC isoliert | | **MSE pur** | `http://thinkcentre.local:1984/mse.html?src=cam0` | MSE isoliert (Referenz) | | **Alle Links** | `http://thinkcentre.local:1984/links.html?src=cam0` | go2rtc listet selbst alle Endpunkte auf | > Hinweis zur go2rtc-Startseite: Die Checkboxen (WebRTC/MSE/MJPEG) oben filtern nur, > welche Technologien der **kombinierte** Player `stream.html` ausprobieren darf – > sichtbar ändert sich dabei nichts, weil er automatisch die erste passende nimmt. > Für einen echten Vergleich **die obigen Einzel-URLs** verwenden. ### Latenz messen (objektiv, in ms) 1. Handy-Stoppuhr mit Millisekunden-Anzeige vor die Kamera halten. 2. MJPEG-URL und WebRTC-URL in zwei Tabs/Fenstern nebeneinander öffnen. 3. Einen Screenshot machen, der **die echte Stoppuhr** und **beide Stream-Bilder** gleichzeitig zeigt (Handy + Monitor zusammen abfotografieren ist am einfachsten). 4. Differenz „echte Zeit ↔ Bild im Stream" ablesen = Gesamt-Latenz pro Protokoll. ### Ergebnis-Tabelle ✅ gemessen 2026-06-03 Methode: Handy-Stoppuhr (ms) vor Kamera, Foto von Monitor + Stoppuhr. | Kamera | MJPEG | WebRTC | MSE | Sieger | |--------|-------|--------|-----|--------| | cam0+1 | ~200 ms | ~130 ms | — | **WebRTC** | MSE nicht gemessen (erwartet schlechter als beide, für Live nicht relevant). --- ## Entscheidungslogik nach dem Test - **WebRTC ≈ MJPEG (Differenz < ~50 ms):** → Bei **WebRTC** bleiben. Vorteil Internet-Skalierung überwiegt die paar ms. - **MJPEG deutlich schneller (Differenz > ~100 ms) UND nur LAN-Nutzung:** → Optional **MJPEG-Viewer** zusätzlich anbieten (simple ``-Seite). go2rtc liefert MJPEG ohnehin schon unter `/api/stream.mjpeg?src=camN`. - **Auflösung weiter drücken:** → In `docker-compose.yaml` unter `configs:` `video_size=640x480` → `320x240`. Test wiederholen. Kleiner = weniger Browser-Last = weniger Latenz. --- ## Weitere Latenz-Stellschrauben (falls WebRTC noch zu träge) 1. **Keyframe-Intervall senken** – H.264 startet erst beim nächsten Keyframe. In der go2rtc-Quelle den Encoder mit `-g 15` (Keyframe alle 0.5 s @30fps) zwingen. 2. **Kamera-natives H.264** – falls die Webcam H.264 direkt liefert (UVC H.264), kann go2rtc ohne Re-Encode durchreichen → minimale CPU + Latenz. Prüfen mit: `v4l2-ctl -d /dev/video0 --list-formats` 3. **`zerolatency`-Tuning** im Encoder (ultrafast + tune zerolatency). 4. **WebRTC statt über Proxy direkt** – Jitter-Buffer des Browsers ist Fixkosten, lässt sich nur begrenzt beeinflussen. --- ## Wichtig: go2rtc bleibt erhalten Da der finale Aufbau weiter auf go2rtc setzt, bleibt **http://thinkcentre.local:1984** dauerhaft als Debug-/Vergleichs-UI nutzbar. Der Protokoll-Vergleich kann also **jederzeit später** nachgeholt werden, ohne etwas umzubauen.