Repository navigation
librtmp2-server 0.6.4
What's Changed
- feat(http): CORS for the public stats endpoints by @AlexanderWagnerDev in #295
- fix(bug-hunter): round 10 - validate peer-supplied cluster addresses (SRV-BUG-1) by @AlexanderWagnerDev in #296
- fix(bug-hunter): round 11 - librtmp2-server by @AlexanderWagnerDev in #297
- fix(bug-hunter): SRV-C-1 / SRV-E-1 - route liveness and publish DB failure classification by @AlexanderWagnerDev in #298
- chore(deps): update taiki-e/install-action digest to 32e16a2 by @renovate[bot] in #299
- fix: concurrency and conflict handling for players and viewers by @AlexanderWagnerDev in #300
- fix: cluster snapshot, ownership handoff, and join resume hardening by @AlexanderWagnerDev in #301
- fix(cluster): validate CLUSTER_JOIN against SSRF peer rules by @cursor[bot] in #302
- chore(deps): update rust crate tokio to v1.53.3 by @renovate[bot] in #304
- fix(deps): update rust crate librtmp2 to 0.13.0 by @renovate[bot] in #305
- fix: viewer fence, snapshot settings clear, and fast-publish cleanup by @AlexanderWagnerDev in #303
Full Changelog: v0.6.3...v0.6.4
Benchmarks
Measured automatically for this release on a CI runner; the machine is described below. Raw data: bench-results-v0.6.4.json.
- Measured: 2026-10-14 22:00:34 UTC ·
3725c85· crate version 0.6.4 · workflow run - Built on: librtmp2 0.13.0
- CPU: INTEL(R) XEON(R) PLATINUM 8573C · 4 vCPUs
- RAM: 15.6 GiB
- System: Linux 6.17.0-1022-azure x86_64 · rustc 1.99.0 · GitHub-hosted ubuntu24 (image 20261004.327.1)
- Noise: shared CI VM — CPU model, neighbouring load and the runner image change between runs, so treat absolute numbers as indicative.
- Comparable vs release v0.6.5: ❌ different hardware (AMD EPYC 9V74 80-Core Processor, 4 vCPUs vs INTEL(R) XEON(R) PLATINUM 8573C, 4 vCPUs): only large changes (> 25 %) mean anything
http_api
| Benchmark | Time | Throughput | vs release v0.6.5 |
|---|---|---|---|
http_api/create_stream |
199.01 µs | — | 🟢 −29.2 % |
http_api/health |
112.72 µs | — | ⚪ −23.5 % |
http_api/list_streams |
629.5 ms | — | 🔴 +34.8 % |
🟢 faster · 🔴 slower · ⚪ within the noise band (5–25 % depending on how comparable the two environments are, plus both runs' Criterion confidence intervals). Lower time is better.
Cross-server sweep
Same RTMP client and ffmpeg source for every server, one server at a time: load viewers 500 1000 2000, publisher ffmpeg 1280x720@30 H.264 2.5 Mbps + AAC 128 kbps. One sweep per run, no repetitions — the shared runner makes single values noisy, so compare servers within this run rather than across runs.
Servers: librtmp2-server 0.6.4 (librtmp2 0.13.0) · MediaMTX v1.21.2 · LiveForge main @ 4e70fb3 · SRS v8.0-d0 · nginx-rtmp nginx 1.31.6 (nginx-rtmp-module @ 6c7719d)
librtmp2-server vs the baselines
| Metric | Now | vs release v0.6.5 |
|---|---|---|
| publish handshakes/s | 11,810 | 🟢 +65.7 % |
| publish handshake avg (ms) | 1.84 | 🟢 −45.1 % |
| publish handshake p95 (ms) | 3.40 | 🟢 −38.6 % |
| play handshakes/s | 12,477 | 🟢 +118.8 % |
| play handshake avg (ms) | 1.69 | 🟢 −55.9 % |
| play handshake p95 (ms) | 3.42 | 🟢 −64.9 % |
| join, 1 viewer: avg (ms) | 0.46 | ⚪ −19.3 % |
| join, 1 viewer: p95 (ms) | 0.46 | ⚪ −19.3 % |
| join, 25 viewers: avg (ms) | 2.23 | 🔴 +61.6 % |
| join, 25 viewers: p95 (ms) | 3.13 | 🔴 +49.8 % |
| join, 100 viewers: avg (ms) | 1.88 | 🟢 −38.4 % |
| join, 100 viewers: p95 (ms) | 4.20 | 🟢 −29.1 % |
| load, 500 viewers: join avg (ms) | 7.60 | 🟢 −51.4 % |
| load, 500 viewers: join p95 (ms) | 19.31 | 🟢 −51.0 % |
| load, 500 viewers: frames/viewer | 73.13 | ⚪ +0.0 % |
| load, 500 viewers: CPU (% of one core) | 20.80 | 🟢 −45.3 % |
| load, 500 viewers: peak RSS (MiB) | 22.50 | ⚪ +0.0 % |
| load, 1000 viewers: join avg (ms) | 14.86 | ⚪ −24.6 % |
| load, 1000 viewers: join p95 (ms) | 43.41 | ⚪ −18.2 % |
| load, 1000 viewers: frames/viewer | 73.12 | ⚪ −0.0 % |
| load, 1000 viewers: CPU (% of one core) | 41.00 | 🟢 −42.3 % |
| load, 1000 viewers: peak RSS (MiB) | 32.20 | ⚪ −0.6 % |
| load, 2000 viewers: join avg (ms) | 24.42 | 🟢 −71.9 % |
| load, 2000 viewers: join p95 (ms) | 84.88 | 🟢 −70.8 % |
| load, 2000 viewers: frames/viewer | 73.14 | ⚪ −0.1 % |
| load, 2000 viewers: CPU (% of one core) | 77.30 | 🟢 −30.9 % |
| load, 2000 viewers: peak RSS (MiB) | 52.10 | ⚪ −1.9 % |
Handshake latency
| Server | publish /s | avg ms | p95 | p99 | play /s | avg ms | p95 | p99 |
|---|---|---|---|---|---|---|---|---|
| librtmp2-server | 11,810 | 1.84 | 3.40 | 3.79 | 12,477 | 1.69 | 3.42 | 4.62 |
| MediaMTX | 9,164 | 2.70 | 4.76 | 7.25 | 7,399 | 3.20 | 5.43 | 5.75 |
| LiveForge | 9,765 | 2.54 | 4.32 | 5.20 | 10,425 | 2.06 | 3.95 | 4.65 |
| SRS | 583.6 | 48.06 | 53.96 | 54.98 | 627.4 | 45.54 | 51.72 | 51.94 |
| nginx-rtmp | 707.6 | 41.72 | 42.55 | 43.25 | 357.3 | 82.83 | 84.02 | 84.88 |
Join latency (avg / p95 ms)
| Server | 1 viewer | 25 viewers | 100 viewers |
|---|---|---|---|
| librtmp2-server | 0.46 / 0.46 | 2.23 / 3.13 | 1.88 / 4.20 |
| MediaMTX | 0.70 / 0.70 | 1.84 / 2.63 | 4.41 / 8.33 |
| LiveForge | 0.53 / 0.53 | 4.23 / 6.98 | 9.86 / 15.44 |
| SRS | 41.48 / 41.48 | 47.01 / 50.44 | 63.25 / 71.22 |
| nginx-rtmp | 81.65 / 81.65 | 82.36 / 83.59 | 83.61 / 85.35 |
Many viewers on one stream
| Viewers | Server | join avg / p95 ms | CPU % (one core) | peak RSS MiB | frames/viewer |
|---|---|---|---|---|---|
| 500 | librtmp2-server | 7.60 / 19.31 | 20.80 | 22.50 | 73.13 |
| 500 | MediaMTX | 22.74 / 36.29 | 57.80 | 108.1 | 73.08 |
| 500 | LiveForge | 30.61 / 70.34 | 30.90 | 98.40 | 73.12 |
| 500 | SRS | 171.6 / 203.4 | 5.60 | 138.2 | 72.21 |
| 500 | nginx-rtmp | 85.90 / 91.87 | 28.90 | 24.00 | 73.05 |
| 1000 | librtmp2-server | 14.86 / 43.41 | 41.00 | 32.20 | 73.12 |
| 1000 | MediaMTX | 27.89 / 65.42 | 114.9 | 159.1 | 73.09 |
| 1000 | LiveForge | 126.0 / 220.1 | 64.50 | 147.7 | 73.09 |
| 1000 | SRS | 389.0 / 1,101 | 11.30 | 183.6 | 72.36 |
| 1000 | nginx-rtmp | 89.60 / 106.1 | 55.10 | 29.90 | 73.09 |
| 2000 | librtmp2-server | 24.42 / 84.88 | 77.30 | 52.10 | 73.14 |
| 2000 | MediaMTX | 87.45 / 176.3 | 197.9 | 294.3 | 73.27 |
| 2000 | LiveForge | 317.9 / 846.1 | 121.6 | 247.6 | 73.09 |
| 2000 | SRS | 700.1 / 1,292 | 23.50 | 263.5 | 73.16 |
| 2000 | nginx-rtmp | 177.2 / 175.7 | 82.00 | 38.20 | 61.54 |
A competitor delivering fewer frames per viewer than the others was overloaded at that step (the delivered rate, not just latency, is the result).