Skip to content
All guides

Low-Latency Streaming: How LL-HLS and LL-DASH Cut the Delay

Where the 30 seconds of latency in a standard HTTP stream actually comes from, and the mechanisms both protocols use to remove most of it.

A standard HTTP-delivered live stream runs 20 to 45 seconds behind real time. For most content nobody notices. For anything where viewers can compare notes with the outside world (live sport alongside social media, an auction, an interactive broadcast) that delay is the product's central defect.

Fixing it starts with understanding that the latency is not one problem. It is four, stacked.

Where the Delay Comes From

Encoding and packaging: one segment duration. A segment cannot be served until it is complete, because until the last frame is written the file does not exist. With six-second segments, the newest available content is already up to six seconds old the moment it appears.

Manifest discovery: up to one segment duration. The player learns a segment exists by re-fetching the playlist. In the worst case it polls just before a new segment is announced and waits nearly a full segment duration to find out.

Player buffer: two to three segments. Players buffer ahead to absorb throughput variation. A three-segment buffer at six seconds each is 18 seconds of deliberate delay.

Network and CDN: one to three seconds. Origin-to-shield-to-edge-to-player, plus any buffering along the way.

Adding those up with six-second segments: 6 + 6 + 18 + 2, comfortably over 30 seconds. And the dominant term is the player buffer, which is why the naive fix (just use shorter segments) helps less than expected. Halving segment duration to three seconds roughly halves the total, but a three-segment buffer of three-second segments is still nine seconds, and you have doubled your request volume to get there.

Getting below five seconds requires breaking the assumption that a segment is the smallest unit that can be delivered.

The Shared Mechanism

Both protocols reach the same conclusion: subdivide segments into chunks that can be delivered before the enclosing segment is finished.

A CMAF chunk is an independently parseable moof+mdat pair, typically 200 to 500 milliseconds. The packager emits chunks continuously as it encodes, and the delivery layer forwards each one immediately. A player can begin decoding a chunk without waiting for the segment that contains it.

This collapses the first delay from a full segment duration to a single chunk duration, and it allows the player to hold a much smaller buffer measured in chunks rather than segments.

Where the two protocols differ is in how the player learns about and requests those chunks.

LL-DASH

LL-DASH uses HTTP/1.1 chunked transfer encoding, which has existed since 1999 and does exactly what is needed here.

The player issues a normal GET for a segment that does not yet exist in full. The origin responds immediately with headers and then streams the body as the packager produces it. The player parses arriving bytes incrementally.

The elegance is that this requires no new manifest syntax for the delivery mechanism itself. The MPD signals availability timing and the availabilityTimeOffset attribute tells the player it may request a segment before its nominal completion time, but the transport is ordinary HTTP.

The difficulty is the CDN. Many caching proxies buffer an entire origin response before forwarding it, because for normal web content that is sensible. Applied to LL-DASH it reconstitutes whole-segment delivery and eliminates the entire benefit while appearing to work perfectly. This must be verified empirically, measure actual glass-to-glass latency through the real delivery path, not through a direct origin connection.

LL-HLS

Apple's approach adds explicit playlist syntax rather than relying on transport behaviour.

Partial segments. Chunks are addressable objects announced with EXT-X-PART tags as they become available, each with its own URI and duration. Recent parts appear alongside complete segments in the media playlist.

Blocking playlist reload. This is the more interesting piece. Rather than polling, the player requests the playlist with _HLS_msn and _HLS_part query parameters naming a future part. The server holds the request open until that part exists, then responds. One round-trip is removed entirely, and polling overhead disappears.

Preload hints. EXT-X-PRELOAD-HINT names the next part before it exists, so the player can issue a request that the server holds open. The part arrives the instant it is produced.

Rendition reports. EXT-X-RENDITION-REPORT includes the current position of other quality levels in each playlist, so a player switching rungs does not need a separate round-trip to discover where the other rendition is.

Together these get LL-HLS to two seconds or below. The cost is a genuinely more demanding server: blocking requests mean many held-open connections, and the CDN must support them rather than timing them out or serving stale playlists.

What Each Costs

That last row deserves emphasis. LL-DASH misconfiguration is insidious precisely because nothing breaks, you simply do not get the latency you built for, and unless you are measuring end-to-end you may not notice.

The Trade Against Stability

Low latency and playback robustness are in direct tension, and this is not a problem that better engineering resolves. A small buffer is what makes low latency possible, and a small buffer is also what makes a stream fragile, a brief throughput dip that a 20-second buffer absorbs invisibly will cause a rebuffer at two seconds.

There is also less room for the adaptation logic to work. Conventional throughput estimation relies on observing complete segment downloads; with chunked delivery the player must estimate from partial transfers, which is noisier. Players running low-latency modes often switch quality more aggressively as a result.

The honest framing is that low latency should be a deliberate product decision with a stated tolerance for increased rebuffering, not a default. For a football match where viewers are on social media, two seconds of latency and an occasional stall is clearly the right trade. For a concert stream or a lecture, 20 seconds and rock-solid playback is better, and nobody will ever know the difference.

A useful middle position is a reduced latency configuration (two-second segments, a two-segment buffer, no chunking) landing around eight to ten seconds. It requires no special CDN capability, no protocol extensions, and no player changes, and it eliminates most of the perceptual gap for a fraction of the operational cost.