Low-latency HLS cuts the delay of a live stream from tens of seconds to a few. Segments are published in small parts as they are encoded, the server holds a playlist request until something new exists, and the player can ask for only the end of a long playlist. These features came after RFC 8216 and are in its successor draft.
EXT-X-SERVER-CONTROL and EXT-X-PART-INF
| Attribute | Type | Meaning |
|---|---|---|
CAN-SKIP-UNTIL | float, seconds | The server can send delta updates that skip segments older than this far from the end. At least six target durations. |
CAN-SKIP-DATERANGES | YES | Delta updates can also drop old date ranges. Needs CAN-SKIP-UNTIL. |
HOLD-BACK | float, seconds | How far from the end a player should stay. At least three target durations, which is also the default. |
PART-HOLD-BACK | float, seconds | The same when playing parts: at least twice, and preferably three times, the part target. Required when there are parts. |
CAN-BLOCK-RELOAD | YES | The server supports blocking playlist reloads. |
#EXT-X-PART-INF:PART-TARGET=s gives the part target duration in seconds.
It is required when the playlist has any EXT-X-PART.
EXT-X-PART
One partial segment: a piece of the segment that will follow. Parts of a segment come
before its EXTINF and URI line. Tags that apply to the whole segment
(discontinuity, key, map, date and time) go before its first part.
| Attribute | Type | Meaning |
|---|---|---|
URI | quoted string, required | Where the part is. |
DURATION | float, required | Its length: at most the part target and normally at least 85% of it. |
INDEPENDENT | YES | The part holds an independent frame, so playback can start there. |
BYTERANGE | quoted string "n[@o]" | A byte range, as for EXT-X-BYTERANGE. |
GAP | YES | The part is not available. |
Hints, reports and skips
| Tag | Attributes | Meaning |
|---|---|---|
#EXT-X-PRELOAD-HINT | TYPE (PART or MAP, required), URI (required), BYTERANGE-START (default 0), BYTERANGE-LENGTH (default: to the end) | A part or initialisation section that does not exist yet; the player may request it now and the server answers when it is ready. |
#EXT-X-RENDITION-REPORT | URI (required), LAST-MSN (required), LAST-PART (required when there are parts) | The newest segment and part of another rendition, so the player can switch without an extra request. |
#EXT-X-SKIP | SKIPPED-SEGMENTS (required), RECENTLY-REMOVED-DATERANGES (tab-separated IDs) | Version 9. In a delta update, stands for that many older segments the player already has. Version 10 when date ranges are skipped too. |
Delivery directives
Query parameters a player adds to a playlist request. They must be in UTF-8 order.
| Parameter | Value | Server response |
|---|---|---|
_HLS_msn | media sequence number | Holds the request until the playlist has that segment (or a later one). Error 400 if it is more than two ahead. |
_HLS_part | part index | With _HLS_msn only: waits for that part of that segment. |
_HLS_skip | YES or v2 | Sends a delta update with EXT-X-SKIP; v2 also skips old date ranges. |
A server that would block for more than three target durations should answer 503.
Worked example
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-TARGETDURATION:4
#EXT-X-SERVER-CONTROL:CAN-BLOCK-RELOAD=YES,PART-HOLD-BACK=1.0,CAN-SKIP-UNTIL=24.0
#EXT-X-PART-INF:PART-TARGET=0.33334
#EXT-X-MEDIA-SEQUENCE:266
#EXT-X-SKIP:SKIPPED-SEGMENTS=3
#EXTINF:4.00008,
fileSequence269.mp4
#EXT-X-PART:DURATION=0.33334,URI="filePart270.0.mp4",INDEPENDENT=YES
#EXT-X-PART:DURATION=0.33334,URI="filePart270.1.mp4"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="filePart270.2.mp4"
#EXT-X-RENDITION-REPORT:URI="../720p/lowlat.m3u8",LAST-MSN=270,LAST-PART=1
?_HLS_msn=270&_HLS_part=1&_HLS_skip=YES:
segments 266 to 268 are skipped, 269 is complete, segment 270 has two parts so far,
and the third is hinted.