This commit is contained in:
team3
2026-08-31 11:54:20 +02:00
parent f29a4106bb
commit e7216138c7
21 changed files with 1517 additions and 87 deletions

View File

@@ -33,11 +33,15 @@ Im Betrieb läuft der Sync täglich um 4:30 von selbst.
## Entwickeln
```bash
make dev # Backend :8000, Frontend :5173
make stop
make dev # MediaMTX, Backend :8000, Frontend :5173
make stop # alles wieder aus
```
Der Vite-Dev-Server leitet `/api` an den Backend-Port weiter.
`make dev` startet MediaMTX als Container mit. Ohne ihn liefe der
Stream-Reiter ins Leere und OBS fände keinen Server. Einzeln geht es über
`make mtx` und `make mtx-stop`.
Der Vite-Dev-Server leitet `/api` ans Backend und `/stream` an MediaMTX.
## Produktiv
@@ -113,6 +117,78 @@ Im Raster stehen Reihen als eine Karte, die durch ihre Teile blättert. Aus
Die Karte startet beim bestbewerteten Teil, danach richtet sich auch ihr
Platz im Raster.
## Der Stream-Reiter
Du sendest von deinem Rechner per OBS an den Server, alle schauen im Browser
zu. Voice läuft weiter über Discord.
```
OBS ──RTMP──► MediaMTX ──LL-HLS──► FastAPI ──► Browser (hls.js)
```
**Senden:**
```bash
make stream # an den lokalen MediaMTX
make stream ZIEL=horror.marha.de # an den Server
make stream-stop # OBS beenden
```
Strg-C im Terminal beendet OBS nicht zuverlässig — deshalb `make stream-stop`
oder einfach das OBS-Fenster schließen.
Das Skript legt ein eigenes OBS-Profil `filmabend` an und startet OBS damit.
Deine normale OBS-Konfiguration bleibt unberührt. Beim Start fragt der
Desktop, welches Fenster übertragen werden soll — erst nach dieser Auswahl
fließen Bilder.
Bitrate und Auflösung stehen in
`~/.config/obs-studio/basic/profiles/filmabend/basic.ini` und werden nur
beim ersten Mal geschrieben. Das Sendeziel aktualisiert das Skript jedes Mal.
Von Hand geht es auch:
| Feld | Wert |
| --- | --- |
| Server | `rtmp://horror.marha.de:1935/` |
| Streamschlüssel | `filmabend?user=sender&pass=<MTX_SENDEPASSWORT>` |
Ohne Passwort weist MediaMTX die Verbindung ab. Zuschauen braucht keins.
**Ton:** OBS nimmt den Desktop-Ton über PulseAudio mit. Im Browser ginge
das nicht — dort liefert `getDisplayMedia` unter Linux nur Tab-Ton, und
Firefox gar keinen.
**Warum alle dasselbe Bild sehen**
Jeder Player hält 4 Sekunden Abstand zur Live-Kante (`liveSyncDuration`).
Wer zurückfällt, spielt bis zu 1,5-fach schneller ab, bis er wieder auf
Ziellatenz ist — das regelt hls.js über `maxLiveSyncPlaybackRate`. Ab 7
Sekunden Rückstand springt es stattdessen.
Gemessen mit zwei unabhängigen Playern am selben Stream:
| Fall | Ergebnis |
| --- | --- |
| Dauerlauf, 45 s | Latenz konstant 4,05 s, keine Regelung nötig |
| Zwei Player | **11 ms** Bildversatz |
| Nach 8 s Aussetzer | zurück auf 12 ms in 9 Sekunden |
Die Anzeige rechts zeigt Verzögerung, Abweichung, Tempo und die Sendezeit
aus dem Manifest. Zwei Zuschauer mit gleicher Sendezeit sehen exakt dasselbe
Bild — damit lässt sich der Gleichlauf im Betrieb prüfen.
**Grenzen**
- Dein Upload muss stabil 6–8 Mbit/s halten. Reicht er nicht, wird es für
alle schlechter.
- Der Server schiebt pro Zuschauer die volle Bitrate raus. Bei 15 Leuten
und 6 Mbit/s sind das 90 Mbit/s und rund 80 GB je Filmabend. Hetzner
liefert 10 Gbit und 20 TB im Monat.
- Der HLS-Proxy in FastAPI reicht jedes Byte durch Python. Für einen
Filmabend genügt das; bei mehr Last gehört eine Traefik-Route direkt auf
MediaMTX davor.
## Vorschläge und Rad
Im Reiter **Rad** landen die Filmvorschläge. Jede Sitzung darf einen Film