Files
pyramid/docs/STREAMING_60FPS.md
T

3.0 KiB
Raw Blame History

Streaming: hohe Auflösung + 60 FPS (M4)

Ziel (Bernd): Bildschirm-Streams ruckeln aktuell. Es soll eine hohe Streaming-Einstellung geben hohe Auflösung UND hohe FPS, idealerweise 60 FPS, flüssig.

Ist-Zustand (im Code gefunden, 2026-07-06)

Datei lib/features/voice_channel/livekit_call_manager.dart:

  • qualityPresets (~Z. 21): Auflösungs-Presets sd(360p) / hd(720p) / fhd(1080p) / 4k(2160p).
  • _screenShareEncodings (~Z. 28): FPS hart gedeckelt sd=10, hd=15, fhd=20, 4k=30. Es gibt KEIN 60-FPS-Preset. Bitraten für hohe FPS zu niedrig (fhd nur 2,5 Mbit/s @20, 4k nur 4 Mbit/s @30).
  • startScreenShare (~Z. 453): erstellt ScreenShareCaptureOptions(maxFrameRate: …) und published mit simulcast: true, degradationPreference: DegradationPreference.balanced.
  • contentHint wird NICHT gesetzt → der Encoder weiß nicht, dass es bewegtes Video ist, und priorisiert Detail/Auflösung statt Framerate → Ruckeln.
  • _applyFpsToAllSimulcastLayers (~Z. 485) hebt die FPS nachträglich auf allen Simulcast-Layern an.

UI lib/features/call_ui/view/quality_menu.dart (~Z. 21): „SENDEN"-Menü listet sd/hd/fhd/4k.

Wahrscheinliche Ruckel-Ursachen

  1. maxFramerate hart auf 2030 begrenzt (nie 60).
  2. Zu niedrige Bitrate für hohe FPS → Encoder verwirft/verwischt Frames.
  3. contentHint nicht auf motion → Encoder opfert FPS für Detail.
  4. degradationPreference: balanced → unter Last sinkt eher die FPS als die Auflösung.

Aufgabe

  1. Neue High-FPS-Presets für die Send-Qualität, z. B.:
    • hd60 → 720p, VideoEncoding(maxBitrate ~45 Mbit/s, maxFramerate 60)
    • fhd60 → 1080p, VideoEncoding(maxBitrate ~68 Mbit/s, maxFramerate 60) Sowohl in qualityPresets (Auflösung) als auch _screenShareEncodings (Bitrate/FPS) eintragen und im „SENDEN"-Menü in quality_menu.dart als „HD 60fps" / „Full HD 60fps" ergänzen.
  2. contentHint = 'motion' auf dem Screenshare-Track setzen (flutter_webrtc/LiveKit-Feld) wichtigster Einzelhebel gegen Ruckeln bei Bewegung.
  3. Für die 60-FPS-Modi degradationPreference: DegradationPreference.maintainFramerate statt balanced (unter Last lieber Auflösung senken als FPS).
  4. Sicherstellen, dass 60 wirklich durchgereicht wird auch in ScreenShareCaptureOptions.maxFrameRate und _applyFpsToAllSimulcastLayers.
  5. Für den flüssigen 60-FPS-Modus simulcast: false erwägen (volle Bitrate auf einen Layer), A/B gegen simulcast=true testen.

Testen (mit den Test-Accounts)

  • Streamen als pyramidtest1, zuschauen als pyramidtest2 (zwei Logins/Fenster).
  • Prüfen, dass sender.parameters.encodings real maxFramerate == 60 und die hohe maxBitrate tragen.
  • Subjektiv: flüssiger? Bei Bewegung kein Ruckeln?
  • EHRLICH protokollieren, was wirklich getestet wurde. Echtes flüssiges 60-FPS-Empfinden ist ggf. nur mit echtem Gerät/Netz voll beurteilbar → dann klar als UNGETESTET markieren.

Nicht vergessen

flutter analyze sauber, kleiner Commit + Push, PROGRESS.md + ROADMAP (M4) pflegen.