Skip to main content

Playback URLs & manifest caching

This page gives the exact HLS and DASH playback URLs for a live stream, how to embed them in a player, and why manifests and segments are cached differently. Playback is delivered and cached by CDN PoPs through the stream's backing property — not by the live PoP directly. Replace <key> with your stream's 10-character emission point, shown on the Endpoints tab in your dashboard.

Playback URLs

FormatURL
HLShttps://<key>.prdrm.net/master.m3u8
DASHhttps://<key>.prdrm.net/index.mpd

Both URLs are always available regardless of which container a transcode profile targets.

Always use the CDN playback host

Play from <key>.prdrm.net. Do not point viewers at the ingest host <key>.live.prdrm.net — that goes to the live PoP (SRS ingest), bypasses the CDN, and is for publishing only. See Live streaming overview.

Embedding in a player

The URLs work with hls.js, dash.js, and native players. CORS is enabled on the backing property (Access-Control-Allow-Origin: *), so browser players can fetch the manifest and segments cross-origin.

HLS with hls.js

<video id="video" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
const url = "https://YOUR_KEY.prdrm.net/master.m3u8";
const video = document.getElementById("video");
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(url);
hls.attachMedia(video);
} else if (video.canPlayType("application/vnd.apple.mpegurl")) {
// Native HLS (Safari, iOS)
video.src = url;
}
</script>

DASH with dash.js

<video id="video" controls></video>
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script>
<script>
const url = "https://YOUR_KEY.prdrm.net/index.mpd";
const player = dashjs.MediaPlayer().create();
player.initialize(document.getElementById("video"), url, true);
</script>

Manifest vs. segment caching

The backing property ships with system cache rules tuned for live. The split between a short manifest TTL and a longer segment TTL is what keeps playback smooth:

WhatPatternTTLWhy
Manifests~* \.(m3u8|mpd)$2sThe live edge advances every segment, so manifests change constantly and must stay fresh.
Segments~* \.(ts|m4s)$10sSegments are immutable within the rolling window, so they can be held a bit longer.
Do not over-cache live manifests

Manifests must stay fresh because the live edge advances every segment — over-caching a manifest stalls playback. Caching segments longer than needed gains nothing because they are immutable within the rolling window. Keep the 2s manifest / 10s segment split.

These are system rules on the managed backing property. To inspect them, open the property from the stream's Endpoints tab. Treat them as the template for any custom HLS/DASH caching you write elsewhere — see HLS rule examples and DASH rule examples for the actual rule definitions.

CORS

A system header rule sets Access-Control-Allow-Origin: * on responses so browser-based players (hls.js, dash.js) can fetch the manifest and segments from any origin. No extra configuration is needed for web playback.

Next steps