You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: refresh README for v2.0.0-beta.9 (player UX, ABR, latency)
- Bump "What's new" to v2.0.0-beta.9 with three new collapsible
sections: Player & UX (stats overlay, posters, viewer count,
DVR, listening time), Lower latency & ABR (1 s segments, master
playlist for OBS simulcast, WHEP), Stability fixes since beta.6.
- "At a glance" row gains WHEP playback, master playlist (simulcast),
poster thumbnails, stats overlay, DVR seek, GHCR multi-arch.
- New "OBS simulcast (ABR ladder)" config snippet under Configuration.
- "Stream from OBS" walkthrough now mentions the STATS button, the
?webrtc=1 opt-in, and 1 s keyframe interval as the latency-friendly
default.
- New **stream stats overlay** (STATS button in the player's bottom strip): transport (HLS/WebRTC/Icecast), audio codec & bitrate, video codec/resolution/FPS/GOP/bitrate, plus client-side buffer seconds, dropped frames + drop %, and HLS live-edge latency.
80
+
- Live **poster thumbnails** on landing & explore cards: the player snapshots the `<video>` element a few seconds into playback and POSTs a JPEG to the server, which caches it per mount and serves it at `/<mount>/poster.jpg`.
81
+
-**Viewer counting** for browser playback: HLS playlist polls and WHEP offers feed a 30 s sliding-window IP tracker. Video mounts no longer show "0 listeners" while people are actively watching, and the player renders "viewers" for video / "listeners" for audio.
82
+
-**Listening time** indicator next to the listener/viewer count; resets on pause.
83
+
- 60 s **DVR window**: every video stream is seekable backwards a minute by default — no extra config, hls.js shows a scrubbable timeline.
84
+
85
+
</details>
86
+
87
+
<detailsopen>
88
+
<summary><strong>Lower latency & ABR</strong> — 1 s segments, master playlist, WHEP egress</summary>
89
+
90
+
- HLS default segment 4 s → **1 s** with keyframe-aligned flushes; segments still cleanly start on IDR even when the encoder's GOP is longer.
91
+
-**OBS simulcast / master playlist** at `/<primary>/master.m3u8`: declare a `variant_groups` map in config, point each OBS output at its own RTMP mount (e.g. `/live`, `/live_720`, `/live_480`), and the server emits a multivariant playlist with `BANDWIDTH` and `RESOLUTION` derived from live ingest metrics.
92
+
-**WHEP** (`POST /<mount>/whep`, `application/sdp` in/out) for sub-second WebRTC viewer playback. Gated behind `?webrtc=1` while we shake out B-frame handling; HLS stays the default.
93
+
- Viewer-side **video metrics** sampled in the ingest path (pure-Go H.264 SPS parser, 1 s rolling window for fps/bitrate, average GOP). Surfaced under each mount in the admin Streams table.
94
+
95
+
</details>
96
+
97
+
<details>
98
+
<summary><strong>Stability fixes since v2.0.0-beta.6</strong></summary>
99
+
100
+
-**Audio buffers**: listener default burst 128 → 512 KiB, transcoder input burst 32 → 256 KiB, listener read chunk 4 → 64 KiB. Tracking 2048 Ogg page offsets (was 128) so a generous burst isn't silently truncated to a few seconds — fixes the "underrun every 4–5 s on reconnect".
101
+
-**Bandwidth meter**: the dashboard's "Inbound" / "Outbound" stats were showing cumulative byte totals as MB/s; now compute a per-tick rate.
102
+
-**Ban false-positives**: a player hammering an offline mount no longer trips the scan-attempt lockout. Distinct-path threshold (25) replaces raw hit count, and configured / known-extension prefetch paths are skipped entirely.
103
+
-**Docker on GHCR**: `ghcr.io/datanoisetv/tinyice:beta` (newest beta), `:latest` (newest stable), `:vX.Y.Z`, `:X.Y`, `:X` — all multi-arch (linux/amd64, linux/arm64) — published on every release tag.
@@ -194,13 +226,14 @@ audio + video at `/<mount>/playlist.m3u8`.
194
226
-**Stream Key**: the mount's source password
195
227
> The classic single-URL form `rtmp://<host>/` + Stream Key `<mount>?key=<password>` also works.
196
228
197
-
4.**OBS → Settings → Output**: Video Encoder `x264` (or a hardware H.264 encoder), Audio Encoder `AAC` (default) or `MP3`, 2 s keyframe interval.
229
+
4.**OBS → Settings → Output**: Video Encoder `x264` (or a hardware H.264 encoder), Audio Encoder `AAC` (default) or `MP3`, **1 s keyframe interval** (matches the default segment size for lowest latency; 2 s is fine too).
198
230
199
231
5. Click **Start Streaming**. Server log shows `RTMP: Publishing started mount=/<name>` and `Parsed AVC config`.
-**WebRTC (sub-second latency, opt-in)**: append `?webrtc=1` to the player URL. Requires the OBS encoder to publish without B-frames (Profile = `baseline`, or `bf=0` in x264 params).
204
237
-**Raw debug**: `http://<host>/<mount>/video` — H.264 Annex-B for `mpv`.
205
238
206
239
---
@@ -275,7 +308,25 @@ Admin → Streams → Edit lets you set per-mount:
275
308
- Source **password** (takes precedence over the default source password)
276
309
-**Visibility** in public listings
277
310
-**Enabled / disabled** (disabled mounts refuse new SOURCE connections)
278
-
-**Burst size** override (default 128 KB — controls the "instant start" at the cost of a little extra latency)
311
+
-**Burst size** override (default 512 KB — controls the "instant start" at the cost of a little extra latency)
312
+
313
+
### OBS simulcast (ABR ladder)
314
+
315
+
Run multiple OBS outputs to different mounts (one per rendition) and group
316
+
them into a single multivariant playlist:
317
+
318
+
```json
319
+
{
320
+
"variant_groups": {
321
+
"/live": ["/live", "/live_720", "/live_480"]
322
+
}
323
+
}
324
+
```
325
+
326
+
`/live/master.m3u8` then advertises all three with `BANDWIDTH` and
327
+
`RESOLUTION` derived from each member's live ingest metrics. The built-in
328
+
player auto-detects the master playlist and lets hls.js do ABR; falls back
329
+
to `/live/playlist.m3u8` when no group is configured.
0 commit comments