Docs

How to publish streams, play them back, and run the 1000-user load test.

Publish a stream

Send any of these to the server; the stream name is yours to choose (mystream below). WebRTC playback needs H.264 video + Opus audio. RTMP sends AAC audio, so every RTMP stream is automatically copied with Opus audio as mystream-webrtc. Watch that one at /live/mystream-webrtc/ to get sound.

# RTMP (OBS: set Server to the URL, Stream Key to the name)
rtmp://192.168.10.50:1935/mystream

# RTSP
rtsp://192.168.10.50:8554/mystream

# SRT
srt://192.168.10.50:8890?streamid=publish:mystream

Play a stream

WebRTC (sub-second):  /live/mystream/        (player page)
WHEP endpoint:        /live/mystream/whep    (for custom players)
Live HLS:             /hls-live/mystream/index.m3u8   (HTTPS domain only*)
Static demo HLS:      /hls/stream.m3u8
Static demo MP4:      /test.mp4

Paths work on both http://192.168.10.50:8099 (LAN) and https://videotest.stormadvsyscorp.com (public, once port forwards are live). The looping demo stream is named test. *Live HLS uses secure session cookies, so browsers need the HTTPS URL; on plain HTTP use WebRTC or the static demo HLS.

Run the 1000-user load test

Best run from a different machine than the server:

docker run --rm -i --network host \
  -v /mnt/user/appdata/video-loadtest/loadtest:/scripts grafana/k6 run \
  -e BASE_URL=http://192.168.10.50:8099 -e VUS=1000 -e DURATION=5m \
  /scripts/page-viewers.js

page-viewers.js hits the site only (the provider's stream is untouched — k6 doesn't run player JavaScript). hls-viewers.js simulates full HLS playback against the local demo stream instead. Pass criteria: error rate under 1%, p95 latency under threshold. Watch the dashboard while it runs.

Capacity notes

1000 viewers × 2.6 Mbps ≈ 2.6 Gbps sustained. A gigabit uplink saturates near 380 concurrent viewers of this bitrate — if segments slow down, check network throughput before blaming the server. For external WebRTC viewers the router must forward UDP/TCP 8189 in addition to 80/443.