Files
pyramid/docs/STREAMING_60FPS.md
T

51 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.