GET :9091/api/v1/streams/demo- Input, tracks, health and enabled output state.
http://127.0.0.1:8080/hls/demo/master.m3u8- Traditional HLS multivariant playlist.
http://127.0.0.1:8080/llhls/demo/master.m3u8- Low-latency HLS multivariant playlist.
Start a node
Compose the smallest useful node: SRT push input with HLS and LL-HLS output.
1. Write JSONC
Save this as dispergo.jsonc. It enables one anonymous SRT listener for a trusted local network and two independent HTTP outputs.
{
"server": {
"operational": {"host": "0.0.0.0", "port": 9091}
},
"input": {
"srt": {
"push": {
"enabled": true,
"listener": {
"host": "0.0.0.0",
"port": 6001,
"allowAnonymous": true
}
}
}
},
"output": {
"root": "/var/lib/dispergo",
"lowWaterMarkBytes": 67108864,
"http": {
"listener": {"host": "0.0.0.0", "port": 8080},
"hls": {"enabled": true},
"llhls": {"enabled": true}
}
}
}
Anonymous SRT is explicit, not safe by default. Use a 10 to 80 byte passphrase instead of allowAnonymous outside a trusted or filtered network.
2. Run
IMAGE=ghcr.io/dispergo/server:vMAJOR.MINOR.PATCH
docker pull "$IMAGE"
docker run --rm --name dispergo \
--read-only \
-p 6001:6001/udp \
-p 127.0.0.1:8080:8080/tcp \
-p 127.0.0.1:9091:9091/tcp \
--mount type=bind,src="$(pwd)/dispergo.jsonc",dst=/etc/dispergo/dispergo.jsonc,readonly \
--tmpfs /var/lib/dispergo:rw,noexec,nosuid,size=1g,uid=65532,gid=65532,mode=0770 \
"$IMAGE"
The container is non-root and reads its configuration from /etc/dispergo/dispergo.jsonc. The temporary output volume is only for this first run.
curl --fail http://127.0.0.1:9091/livez
curl --fail http://127.0.0.1:9091/readyz
3. Push media
The SRT streamid is the canonical stream ID. This command publishes a test stream named demo:
ffmpeg -re \
-f lavfi -i 'testsrc2=size=1280x720:rate=25' \
-f lavfi -i 'sine=frequency=1000:sample_rate=48000' \
-c:v libx264 -preset veryfast -tune zerolatency \
-g 50 -keyint_min 50 -sc_threshold 0 \
-c:a aac -f mpegts \
'srt://127.0.0.1:6001?mode=caller&streamid=demo'