3.0 KiB
3.0 KiB
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-Presetssd(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): erstelltScreenShareCaptureOptions(maxFrameRate: …)und published mitsimulcast: true,degradationPreference: DegradationPreference.balanced.contentHintwird 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
maxFrameratehart auf 20–30 begrenzt (nie 60).- Zu niedrige Bitrate für hohe FPS → Encoder verwirft/verwischt Frames.
contentHintnicht aufmotion→ Encoder opfert FPS für Detail.degradationPreference: balanced→ unter Last sinkt eher die FPS als die Auflösung.
Aufgabe
- Neue High-FPS-Presets für die Send-Qualität, z. B.:
hd60→ 720p,VideoEncoding(maxBitrate ~4–5 Mbit/s, maxFramerate 60)fhd60→ 1080p,VideoEncoding(maxBitrate ~6–8 Mbit/s, maxFramerate 60)Sowohl inqualityPresets(Auflösung) als auch_screenShareEncodings(Bitrate/FPS) eintragen und im „SENDEN"-Menü inquality_menu.dartals „HD 60fps" / „Full HD 60fps" ergänzen.
contentHint = 'motion'auf dem Screenshare-Track setzen (flutter_webrtc/LiveKit-Feld) – wichtigster Einzelhebel gegen Ruckeln bei Bewegung.- Für die 60-FPS-Modi
degradationPreference: DegradationPreference.maintainFrameratestattbalanced(unter Last lieber Auflösung senken als FPS). - Sicherstellen, dass 60 wirklich durchgereicht wird – auch in
ScreenShareCaptureOptions.maxFrameRateund_applyFpsToAllSimulcastLayers. - Für den flüssigen 60-FPS-Modus
simulcast: falseerwä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.encodingsrealmaxFramerate == 60und die hohemaxBitratetragen. - 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.