What the Alteox Media Server does
A single, self-contained server. Every feature below is in the product and documented in its operations guide and API reference.
Robust by design
Malformed or unusual input never crashes the server and never affects other channels.
- In-house MPEG-TS demuxer and muxer; every parser is fuzz-tested and returns errors instead of failing.
- Every channel component runs with panic recovery: it is restarted, logged and counted — the other channels keep running.
- A slow viewer, a bad input or a crashing transcoder affects only itself: publishers never block, lagging consumers are dropped.
- The transcoder runs as a separate, supervised process with restart backoff and an output-stall watchdog.
- Subtitles, teletext and SCTE-35 are re-muxed by the Go core, never by the transcoder — their oddities cannot crash it.
- Tested against a corpus of damaged streams: dropped packets, CC errors, truncated packets, garbage bytes, PMT/PID changes, PCR/PTS jumps and 33-bit wraps.
Ingest: SRT, UDP, HTTP-TS, HLS
Pull and push inputs in any mix per channel, in priority order.
- SRT caller (pull) and listener (push), on a shared listener with stream ids or on dedicated per-channel ports with their own passphrase.
- UDP unicast and multicast including source-specific multicast, raw TS or RTP-wrapped TS.
- HTTP(S) MPEG-TS pull, and HLS pull with TS and fMP4 segments.
- Custom request headers and User-Agent for HTTP and HLS inputs.
- copy:// takes another channel’s output in-process, without copying data.
Outputs: SRT, UDP, HTTP-TS, HLS, DASH
Every channel can be served on every protocol at the same time.
- SRT on a shared listener (stream id read:<channel>), on dedicated per-channel play ports, or pushed as SRT caller.
- UDP MPEG-TS unicast/multicast with configurable TTL and interface, paced at constant rate by PCR.
- HTTP MPEG-TS at /<channel>/mpegts.
- HLS with CMAF/fMP4 segments (optionally TS segments) and a multivariant playlist for ABR; DASH from the same CMAF segments.
- New SRT and HTTP-TS viewers start at a keyframe (fast start).
Per-rendition outputs
Give a customer one rung of the ABR ladder — or the untranscoded source — over SRT or HTTP-TS.
- SRT: streamid=read:<channel>/<rendition> or read:<channel>/source; a dedicated play port can be fixed to one rendition.
- HTTP-TS: /<channel>/<rendition>/mpegts and /<channel>/source/mpegts.
- The auth hook sees the requested rendition; the channel page lists every per-rendition URL with a copy button.
NVIDIA GPU transcoding
Full GPU pipeline from NVDEC to NVENC, one transcoder process per channel for the whole ABR ladder.
- Frames never leave the GPU: NVDEC → CUDA deinterlacer → split → scale_cuda → NVENC.
- All renditions come from one decode; every audio track is decoded and encoded once, not once per rendition.
- Dynamic filters: the deinterlacer runs only for interlaced sources, letterbox/blur backgrounds only when the aspect ratio differs; a source change re-plans the filters.
- GPU admission control: nvidia-smi monitoring, a capacity model per GPU model, least-loaded GPU selection, NVENC session limits, reject/queue/CPU fallback when full.
- Also Intel Quick Sync, VAAPI and CPU encoding.
Measured capacity: NVIDIA RTX 4000 SFF Ada Generation
3 renditions: 720p, 576p, 360p (H.264 NVENC) + AAC audio; measured next to another media server on the same GPU, which itself used about 22–35 % of NVENC/NVDEC.
| Source | Filters | Channels | Stopped by | GPU | NVENC | NVDEC | Memory | Power |
|---|---|---|---|---|---|---|---|---|
| 1080p50 H.264 | dynamic (no deinterlacer, no background for 16:9) | 17 | NVENC guard (85 %) | 38 % | 68 % | 54 % | 13.7 GB | 65 W |
| 1080p50 H.264 | full graph (deinterlace and background always) | 19 | NVENC guard (85 %) | 54 % | 78 % | 56 % | 15.4 GB | 68 W |
| 1080i25 H.264 | full graph | 16 | a source format change, not capacity | 48 % | 69 % | 58 % | 14.1 GB | 67 W |
Utilisation at the end of each run, including the other media server on the same GPU. Ramp: one channel added about every 90 s, stop when a transcoder falls behind real time or NVENC/NVDEC reach 85 %. Your numbers depend on sources, ladder and filters — calibrate on your hardware.


Smart input failover and input pool
Ordered backup inputs, hot or cold standby, and an input pool that picks the better source.
- An input fails after no valid video for loss_timeout (default 2 s); the channel switches to the best healthy input, on a keyframe when possible, and returns to the primary after return_after (default 30 s).
- Timestamps stay monotonic and PIDs stable across switches; players see one continuous stream.
- Per-input media analysis (codec, resolution, scan, frame rate, tracks, languages) and a 5-minute stability window of errored seconds.
- select: quality ranks inputs by complete tracks, error rate and resolution class; max_connected limits how many sources are pulled at once, with probing and exponential cooldown.
- Manual switch to any input from the UI or API.


On-demand channels
Run a channel — or only its transcoder — while someone is watching.
- on_demand: inputs and transcoder start with the first viewer and sleep after on_demand_idle (default 30 s) without viewers.
- transcode_on_demand: the source keeps running for UDP/TS customers; the transcoder and its GPU only run while a transcoded output is watched.
- Waiting viewers are held until data flows (SRT, HTTP-TS) or the first segments exist (HLS/DASH). Sleeping channels raise no alarms.
Channel templates
Shared settings for many channels; each channel stores only what it overrides.
- Templates hold outputs, failover, transcoding, track mapping, access control, labels and on-demand settings.
- Changing a template restarts exactly the channels whose effective settings changed.
- The channel editor shows inherited fields with Override / Reset to template.


Dynamic channels from a lookup server
Channels created on request from a configuration backend (Flussonic config_external).
- A request for an unknown channel name asks the lookup server; the answer becomes an on-demand channel.
- Works on SRT, HTTP-TS and HLS/DASH entry requests; names may contain "/".
- Refreshed periodically; a failing lookup server never stops a running channel.
Flussonic compatibility
Configuration importer, auth backend protocol, event sinks and an HTTP API v3 subset for drop-in migration.
- Importer for flussonic.conf: CLI, REST API (dry run by default) and web UI, with a report of everything mapped differently.
- auth.backend_protocol: flussonic — existing Flussonic auth backends work unchanged, including multiple backends and X-AuthDuration re-checks.
- Flussonic-style event sinks (play_started, play_closed, source events).
- A Flussonic HTTP API v3 subset under /streamer/api/v3, so control planes can monitor the server.
Web UI and REST API
An embedded web UI built on a documented REST API with an OpenAPI 3.1 contract.
- Dashboard with card and dense list views for many channels, bulk actions by label, live updates over server-sent events.
- Channel editor with a visual track mapper, transcode profile editor, sessions view with kick and block.
- REST API with API keys or users (admin / viewer roles), JSON Merge Patch, If-Match concurrency, dry runs.
- Prometheus metrics at /metrics; health endpoints for load balancers and a Nagios-format health check.


Analytics and TR 101 290
History of bit rates, viewers and errors per channel and per source, plus ETSI TR 101 290 per input.
- In-memory history since start: 1 hour at 10 s, 24 hours at 1 minute, 7 days at 10 minutes.
- Errors per channel and per source (an input URL shared by several channels), CPU, memory and per-GPU utilisation, NVENC, NVDEC, temperature and power.
- ETSI TR 101 290 priority 1–3 indicators per input, with a channel drill-down.


Clustering with hot and cold standby
Raft-replicated configuration, automatic channel placement and takeover.
- Cold standby: surviving nodes take over a failed node’s channels.
- Hot standby per channel: a second node runs inputs, transcoder and packager with muted UDP outputs and identical HLS/DASH segment numbers.
- Measured in loopback end-to-end tests: cold takeover about 4 s, hot standby 1.9–2.5 s to serving.
- GPU-aware placement, drain for maintenance, fencing of nodes that lose the leader, TLS 1.3 between nodes.
Alarms and notifications
Channel outages, failovers, transcoder crash loops, GPU and cluster alarms — to Mattermost, Slack, e-mail or a webhook.
- Flap suppression, batching, rate limits, retries and bounded queues: raising an alarm never blocks.
- Alarms in the UI, the API, server-sent events and Prometheus metrics.
- In a cluster, cluster-wide alarms come from the leader only.
Track mapping
Choose audio, subtitle, teletext and SCTE-35 tracks by language, codec or page — on fixed output PIDs.
- Selectors with fallbacks (e.g. German audio, else the first one), fixed bindings and required tracks with an alarm when missing.
- Output PIDs depend only on the configuration, so an input switch or a broadcaster PID change causes no PID churn.
- One source track can feed several outputs, e.g. AC-3 copied plus the same track as AAC.


Access control
An external HTTP auth hook for publish and play on every protocol.
- Results are cached; on hook failure the default is deny (configurable).
- SRT is authorised before the handshake completes; HLS/DASH sessions are tracked across playlist and segment requests.
- Kick sessions by id, user, token or IP, optionally with a temporary block.