Files
appRobotWebcam/doc/03_Protocoll_roadmap.md
2026-06-03 19:50:16 +02:00

4.6 KiB
Raw Blame History

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, <img> rendert sofort hoch (jedes Frame voll)
WebRTC niedrig H.264-Encode + Jitter-Buffer im Browser; dafür effiziente Kompression niedrig
MSE mittelhoch 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 13 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: cam0cam1 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 (später ausfüllen)

Kamera MJPEG roh WebRTC MSE Sieger
cam0 ? ms ? ms ? ms ?
cam1 ? ms ? ms ? ms ?

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 <img>-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=640x480320x240. 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.