Skip to content

Commit 9cc24ef

Browse files
author
DatanoiseTV
committed
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.
1 parent e507bae commit 9cc24ef

1 file changed

Lines changed: 59 additions & 8 deletions

File tree

README.md

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,51 @@ control, and a built-in admin SPA. Deploy anywhere in seconds.
5858
| | |
5959
|---|---|
6060
| **Ingest** | Icecast2 SOURCE/PUT · RTMP (H.264 + AAC/MP3) · SRT MPEG-TS · WebRTC browser broadcasting · Icecast relay pull |
61-
| **Output** | Icecast passthrough · HLS audio · **HLS audio + video** · WebRTC playback · embeddable player |
61+
| **Output** | Icecast passthrough · HLS audio · **HLS audio + video** · **WHEP / WebRTC playback** · **OBS simulcast (master playlist)** · embeddable player |
6262
| **Codecs** | MP3 · Ogg Opus · Ogg Vorbis · FLAC / FLAC-in-Ogg · WAV (8/16/24/32-bit & float) · H.264 · AAC-LC |
6363
| **Transcoder** | Pure-Go multi-codec decode → MP3 or Opus with automatic resampling. No FFmpeg dependency. |
6464
| **AutoDJ** | Multi-instance, keyframe-accurate pacing, shuffle/loop/queue, MPD protocol per instance, external `song_command` hook |
6565
| **Auth** | Username + bcrypt password · Passkeys (WebAuthn) · OIDC/OAuth2 · Bearer API tokens · per-mount source passwords |
66-
| **Ops** | Prometheus metrics · structured logging · ACME auto-HTTPS (Let's Encrypt) · zero-downtime hot-swap · Docker image |
66+
| **Player** | 16:9 video layout · live poster thumbnails · stream stats overlay (codec/res/fps/GOP/bitrate, dropped frames, buffer, latency) · DVR seek (last 60 s) |
67+
| **Ops** | Prometheus metrics · structured logging · ACME auto-HTTPS (Let's Encrypt) · zero-downtime hot-swap · Docker image (GHCR multi-arch) |
6768
| **Deploy** | One static Go binary (≈25 MB) with all assets embedded · `make build` also produces multi-stage Docker image |
6869

6970
---
7071

71-
## What's new in v2.0.0-beta.6
72+
## What's new in v2.0.0-beta.9
7273

73-
Video streaming + a round of audio/auth/ops hardening.
74+
Latency, player UX and an honest viewer count.
75+
76+
<details open>
77+
<summary><strong>Player &amp; UX</strong> — stats overlay, posters, DVR, viewer count, listening time</summary>
78+
79+
- New **stream stats overlay** (STATS button in the player's bottom strip): transport (HLS/WebRTC/Icecast), audio codec &amp; 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 &amp; 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+
<details open>
88+
<summary><strong>Lower latency &amp; 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.
104+
105+
</details>
74106

75107
<details>
76108
<summary><strong>Video pipeline end-to-end</strong> — RTMP/SRT → HLS A/V → browser or mpv</summary>
@@ -194,13 +226,14 @@ audio + video at `/<mount>/playlist.m3u8`.
194226
- **Stream Key**: the mount's source password
195227
> The classic single-URL form `rtmp://<host>/` + Stream Key `<mount>?key=<password>` also works.
196228
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).
198230

199231
5. Click **Start Streaming**. Server log shows `RTMP: Publishing started mount=/<name>` and `Parsed AVC config`.
200232

201-
6. **Watch it** one of three ways:
202-
- **Browser player**: `https://<host>/player/<mount>`automatically renders a 16 : 9 `<video>` layout.
233+
6. **Watch it** one of four ways:
234+
- **Browser player**: `https://<host>/player/<mount>`auto 16:9 `<video>` layout, click the **STATS** button for codec / resolution / fps / GOP / bitrate / dropped frames / buffer / latency. The bottom strip also shows live viewer count and listening time.
203235
- **Direct HLS**: `https://<host>/<mount>/playlist.m3u8` — VLC, mpv, ffplay, Safari, iOS.
236+
- **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).
204237
- **Raw debug**: `http://<host>/<mount>/video` — H.264 Annex-B for `mpv`.
205238

206239
---
@@ -275,7 +308,25 @@ Admin → Streams → Edit lets you set per-mount:
275308
- Source **password** (takes precedence over the default source password)
276309
- **Visibility** in public listings
277310
- **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.
279330

280331
### Branding
281332

0 commit comments

Comments
 (0)