HLS Draft Pantos
HLS Draft Pantos
Abstract
Copyright Notice
Copyright (c) 2024 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document may not be modified, and derivative works of it may not
be created, except to format it for publication as an RFC or to
translate it into languages other than English.
Table of Contents
4.4.4.5. EXT-X-MAP . . . . . . . . . . . . . . . . . . . . 27
4.4.4.6. EXT-X-PROGRAM-DATE-TIME . . . . . . . . . . . . . 28
4.4.4.7. EXT-X-GAP . . . . . . . . . . . . . . . . . . . . 29
4.4.4.8. EXT-X-BITRATE . . . . . . . . . . . . . . . . . . 29
4.4.4.9. EXT-X-PART . . . . . . . . . . . . . . . . . . . 29
4.4.5. Media Metadata Tags . . . . . . . . . . . . . . . . . 30
4.4.5.1. EXT-X-DATERANGE . . . . . . . . . . . . . . . . . 31
4.4.5.1.1. Mapping SCTE-35 into EXT-X-DATERANGE . . . . 33
4.4.5.2. EXT-X-SKIP . . . . . . . . . . . . . . . . . . . 35
4.4.5.3. EXT-X-PRELOAD-HINT . . . . . . . . . . . . . . . 36
4.4.5.4. EXT-X-RENDITION-REPORT . . . . . . . . . . . . . 37
4.4.6. Multivariant Playlist Tags . . . . . . . . . . . . . 38
4.4.6.1. EXT-X-MEDIA . . . . . . . . . . . . . . . . . . . 38
4.4.6.1.1. Rendition Groups . . . . . . . . . . . . . . 43
4.4.6.2. EXT-X-STREAM-INF . . . . . . . . . . . . . . . . 43
4.4.6.2.1. Alternative Renditions . . . . . . . . . . . 51
4.4.6.3. EXT-X-I-FRAME-STREAM-INF . . . . . . . . . . . . 52
4.4.6.4. EXT-X-SESSION-DATA . . . . . . . . . . . . . . . 52
4.4.6.5. EXT-X-SESSION-KEY . . . . . . . . . . . . . . . . 54
4.4.6.6. EXT-X-CONTENT-STEERING . . . . . . . . . . . . . 54
5. Key Files . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.1. Structure of Key Files . . . . . . . . . . . . . . . . . 55
5.2. IV for AES-128 . . . . . . . . . . . . . . . . . . . . . 55
6. Client/Server Responsibilities . . . . . . . . . . . . . . . 55
6.1. Introduction . . . . . . . . . . . . . . . . . . . . . . 55
6.2. Server Responsibilities . . . . . . . . . . . . . . . . . 55
6.2.1. General Server Responsibilities . . . . . . . . . . . 56
6.2.2. Live Playlists . . . . . . . . . . . . . . . . . . . 59
6.2.3. Encrypting Media Segments . . . . . . . . . . . . . . 60
6.2.4. Providing Variant Streams . . . . . . . . . . . . . . 61
6.2.5. Delivery Directives Interface . . . . . . . . . . . . 63
6.2.5.1. Playlist Delta Updates . . . . . . . . . . . . . 63
6.2.5.2. Blocking Playlist Reload . . . . . . . . . . . . 64
6.2.6. Providing Preload Hints . . . . . . . . . . . . . . . 65
6.3. Client Responsibilities . . . . . . . . . . . . . . . . . 66
6.3.1. General Client Responsibilities . . . . . . . . . . . 66
6.3.2. Loading the Media Playlist File . . . . . . . . . . . 67
6.3.3. Playing the Media Playlist File . . . . . . . . . . . 68
6.3.4. Reloading the Media Playlist File . . . . . . . . . . 69
6.3.5. Determining the Next Segment to Load . . . . . . . . 70
6.3.6. Decrypting Encrypted Media Segments . . . . . . . . . 70
6.3.7. Requesting Playlist Delta Updates . . . . . . . . . . 71
6.3.8. Issuing Blocking Requests . . . . . . . . . . . . . . 72
7. Content Steering . . . . . . . . . . . . . . . . . . . . . . 73
7.1. Steering Manifest . . . . . . . . . . . . . . . . . . . . 73
7.2. Pathway Cloning . . . . . . . . . . . . . . . . . . . . . 74
7.3. Steering Query Parameters . . . . . . . . . . . . . . . . 76
7.4. Steering Client Responsibilities . . . . . . . . . . . . 77
Since its first draft publication in 2009, HTTP Live Streaming has
been implemented and deployed by a wide array of content producers,
tools vendors, distributors, and device manufacturers. In the
subsequent ten years the protocol has been refined by extensive
review and discussion with a variety of media streaming implementors.
2. Overview
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
The first line is the format identifier tag #EXTM3U. The line
containing #EXT-X-TARGETDURATION says that all Media Segments will be
10 seconds long or less. Then, three Media Segments are declared.
The first and second are 9.009 seconds long; the third is 3.003
seconds.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.
3. Media Segments
MPEG-4 Fragments are specified by the ISO Base Media File Format
[ISOBMFF]. Unlike regular MPEG-4 files that have a Movie Box
('moov') that contains sample tables and a Media Data Box ('mdat')
containing the corresponding samples, an MPEG-4 Fragment consists of
a Movie Fragment Box ('moof') containing a subset of the sample table
and a Media Data Box containing those samples. Use of MPEG-4
Fragments does require a Movie Box for initialization, but that Movie
Box contains only non-sample-specific information such as track and
sample descriptions.
A Packed Audio Segment contains encoded audio samples and ID3 tags
that are simply packed together with minimal framing and no per-
sample timestamps. Supported Packed Audio formats are Advanced Audio
Coding (AAC) with Audio Data Transport Stream (ADTS) framing
[ISO_13818_7], MP3 [ISO_13818_3], AC-3 [AC_3], and Enhanced AC-3
[AC_3].
Each Packed Audio Segment MUST signal the timestamp of its first
sample with an ID3 Private frame (PRIV) tag [ID3] at the beginning of
the segment. The ID3 PRIV owner identifier MUST be
"com.apple.streaming.transportStreamTimestamp". The ID3 payload MUST
be a 33-bit MPEG-2 Program Elementary Stream timestamp expressed as a
big-endian eight-octet number, with the upper 31 bits set to zero.
Clients SHOULD NOT play Packed Audio Segments without this ID3 tag.
3.1.4. WebVTT
Each WebVTT Segment MUST contain all subtitle cues that are intended
to be displayed during the period indicated by the segment EXTINF
duration. The start time offset and end time offset of each cue MUST
(with the single exception noted below) indicate the total display
time for that cue, even if part of the cue time range is outside the
Segment period. A WebVTT Segment MAY contain no cues; this indicates
that no subtitles are to be displayed during that period.
Each WebVTT Segment MUST either start with a WebVTT header or have an
EXT-X-MAP tag applied to it.
indicating the media time to which the cue time MUST be mapped. The
cue timestamp in the LOCAL attribute MAY fall outside the range of
time covered by the segment.
The MPEGTS media timestamp MUST use a 90KHz timescale, even when non-
WebVTT Media Segments use a different timescale.
Each IMSC Segment MUST contain all subtitle samples that are intended
to be displayed during the period indicated by the segment EXTINF
duration. Each Segment MUST contain definitions for all styles which
are applied to any part of any sample in the Segment.
Each Partial Segment also has a Media Sequence Number, which is equal
to the Media Sequence Number of its Parent Segment.
4. Playlists
The format of the Playlist files is derived from the M3U [M3U]
playlist file format and inherits two tags from that earlier file
format: EXTM3U (Section 4.4.1.1) and EXTINF (Section 4.4.4.1).
Lines that start with the character '#' are either comments or tags.
Tags begin with #EXT. They are case sensitive. All other lines that
begin with '#' are comments and SHOULD be ignored.
The segment bit rate of a Media Segment is the size of the Media
Segment divided by its EXTINF duration (Section 4.4.4.1). Note that
this includes container overhead but does not include overhead
imposed by the delivery system, such as HTTP, TCP, or IP headers.
The peak segment bit rate of a Media Playlist is the largest bit rate
of any contiguous set of segments whose total duration is between 0.5
times the Target Duration and 1.5 times the Target Duration plus 0.5
seconds (since media segments may exceed the Target Duration by up to
0.5 seconds). The bit rate of a set is calculated by dividing the
sum of the segment sizes by the sum of the segment durations.
The average segment bit rate of a Media Playlist is the sum of the
sizes (in bits) of every Media Segment in the Media Playlist, divided
by the Media Playlist duration. Note that this includes container
overhead, but not HTTP or other overhead imposed by the delivery
system.
AttributeName=AttributeValue
* URI lines
* quoted-string AttributeValues
* hexadecimal-sequence AttributeValues
4.4.1.1. EXTM3U
The EXTM3U tag indicates that the file is an Extended M3U [M3U]
Playlist file. It MUST be the first line of every Media Playlist and
every Multivariant Playlist. Its format is:
#EXTM3U
4.4.1.2. EXT-X-VERSION
#EXT-X-VERSION:<n>
A Playlist file MUST NOT contain more than one EXT-X-VERSION tag. If
a client encounters a Playlist with multiple EXT-X-VERSION tags, it
MUST fail to parse it.
Tags in this section MUST NOT appear more than once in a Playlist.
If one does, clients MUST fail to parse the Playlist. The only
exception to this rule is EXT-X-DEFINE, which MAY appear more than
once.
4.4.2.1. EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-INDEPENDENT-SEGMENTS
4.4.2.2. EXT-X-START
#EXT-X-START:<attribute-list>
TIME-OFFSET
If the Playlist does not contain the EXT-X-ENDLIST tag, the TIME-
OFFSET SHOULD NOT be within three Target Durations of the end of
the Playlist file.
PRECISE
4.4.2.3. EXT-X-DEFINE
#EXT-X-DEFINE:<attribute-list>
NAME
VALUE
IMPORT
If the IMPORT attribute value does not match any Variable Name
declared in the Multivariant Playlist, or if the Media Playlist
was not loaded from a Multivariant Playlist, the parser MUST fail
to parse the Playlist.
QUERYPARAM
If the URI is redirected, the client MUST look for the query
parameter in the 30x response URI.
An EXT-X-DEFINE tag MUST NOT specify the same Variable Name as any
other EXT-X-DEFINE tag in the same Playlist. Parsers that encounter
duplicate Variable Name declarations MUST fail to parse the Playlist.
4.4.3.1. EXT-X-TARGETDURATION
#EXT-X-TARGETDURATION:<s>
4.4.3.2. EXT-X-MEDIA-SEQUENCE
#EXT-X-MEDIA-SEQUENCE:<number>
See Section 6.2.1 and Section 6.3.5 for more information on setting
the EXT-X-MEDIA-SEQUENCE tag.
4.4.3.3. EXT-X-DISCONTINUITY-SEQUENCE
#EXT-X-DISCONTINUITY-SEQUENCE:<number>
See Section 6.2.1 and Section 6.2.2 for more information about
setting the value of the EXT-X-DISCONTINUITY-SEQUENCE tag.
4.4.3.4. EXT-X-ENDLIST
#EXT-X-ENDLIST
4.4.3.5. EXT-X-PLAYLIST-TYPE
#EXT-X-PLAYLIST-TYPE:<type-enum>
4.4.3.6. EXT-X-I-FRAMES-ONLY
#EXT-X-I-FRAMES-ONLY
4.4.3.7. EXT-X-PART-INF
#EXT-X-PART-INF:<attribute-list>
PART-TARGET
4.4.3.8. EXT-X-SERVER-CONTROL
#EXT-X-SERVER-CONTROL:<attribute-list>
CAN-SKIP-UNTIL
CAN-SKIP-DATERANGES
HOLD-BACK
PART-HOLD-BACK
CAN-BLOCK-RELOAD
4.4.4.1. EXTINF
#EXTINF:<duration>,[<title>]
4.4.4.2. EXT-X-BYTERANGE
#EXT-X-BYTERANGE:<n>[@<o>]
4.4.4.3. EXT-X-DISCONTINUITY
#EXT-X-DISCONTINUITY
* file format
* timestamp sequence
* encoding parameters
* encoding sequence
See Section 3, Section 6.2.1, and Section 6.3.3 for more information
about the EXT-X-DISCONTINUITY tag.
4.4.4.4. EXT-X-KEY
#EXT-X-KEY:<attribute-list>
METHOD
URI
IV
KEYFORMAT
KEYFORMATVERSIONS
If the Media Playlist file does not contain an EXT-X-KEY tag, then
Media Segments are not encrypted.
See Section 5 for the format of the Key file, and Section 5.2,
Section 6.2.3, and Section 6.3.6 for additional information on Media
Segment encryption.
4.4.4.5. EXT-X-MAP
#EXT-X-MAP:<attribute-list>
URI
BYTERANGE
Use of the EXT-X-MAP tag in a Media Playlist that contains the EXT-
X-I-FRAMES-ONLY tag REQUIRES a compatibility version number of 5 or
greater. Use of the EXT-X-MAP tag in a Media Playlist that DOES NOT
contain the EXT-X-I-FRAMES-ONLY tag REQUIRES a compatibility version
number of 6 or greater.
4.4.4.6. EXT-X-PROGRAM-DATE-TIME
#EXT-X-PROGRAM-DATE-TIME:<date-time-msec>
For example:
#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
See Section 6.2.1 and Section 6.3.3 for more information on the EXT-
X-PROGRAM-DATE-TIME tag.
4.4.4.7. EXT-X-GAP
The EXT-X-GAP tag indicates that the segment URI to which it applies
does not contain media data and SHOULD NOT be loaded by clients. It
applies only to the next Media Segment.
#EXT-X-GAP
See Section 6.2.1 and Section 6.3.3 for more information on the EXT-
X-GAP tag.
4.4.4.8. EXT-X-BITRATE
#EXT-X-BITRATE:<rate>
4.4.4.9. EXT-X-PART
#EXT-X-PART:<attribute-list>
URI
DURATION
INDEPENDENT
BYTERANGE
GAP
All Media Segment Tags (Section 4.4.4) except for EXT-X-BYTERANGE and
EXT-X-GAP that are applied to a Parent Segment MUST appear before the
first EXT-X-PART tag of that Parent Segment.
4.4.5.1. EXT-X-DATERANGE
#EXT-X-DATERANGE:<attribute-list>
ID
CLASS
START-DATE
CUE
END-DATE
DURATION
PLANNED-DURATION
X-<client-attribute>
END-ON-NEXT
If the actual end date and time is not known when an SCTE35-OUT
attribute is added to the Playlist, the DURATION attribute and the
END-TIME attribute MUST NOT be present; the actual end date of the
splice SHOULD be signaled by another EXT-X-DATERANGE tag once it has
been established.
4.4.5.2. EXT-X-SKIP
#EXT-X-SKIP:<attribute-list>
SKIPPED-SEGMENTS
RECENTLY-REMOVED-DATERANGES
4.4.5.3. EXT-X-PRELOAD-HINT
#EXT-X-PRELOAD-HINT:<attribute-list>
TYPE
URI
BYTERANGE-START
BYTERANGE-LENGTH
4.4.5.4. EXT-X-RENDITION-REPORT
#EXT-X-RENDITION-REPORT:<attribute-list>
URI
LAST-MSN
LAST-PART
4.4.6.1. EXT-X-MEDIA
#EXT-X-MEDIA:<attribute-list>
TYPE
URI
GROUP-ID
LANGUAGE
ASSOC-LANGUAGE
NAME
STABLE-RENDITION-ID
DEFAULT
AUTOSELECT
FORCED
INSTREAM-ID
The values "CC1", "CC2", "CC3", and "CC4" identify a Line 21 Data
Services channel [CEA608]. The "SERVICE" values identify a
Digital Television Closed Captioning [CEA708] service block
number.
For all other TYPE values, the INSTREAM-ID MUST NOT be specified.
BIT-DEPTH
SAMPLE-RATE
CHARACTERISTICS
CHANNELS
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subtitles",
NAME="Bokmael",AUTOSELECT=YES,LANGUAGE="nb",
ASSOC-LANGUAGE="no",URI="nb-subtitles.m3u8"
A set of one or more EXT-X-MEDIA tags with the same GROUP-ID value
and the same TYPE value defines a Group of Renditions. Each member
of the Group MUST be an alternative Rendition of the same content;
otherwise, playback errors can occur.
* All EXT-X-MEDIA tags in the same Group MUST have different NAME
attributes.
* A Group MUST NOT have more than one member with a DEFAULT
attribute of YES.
4.4.6.2. EXT-X-STREAM-INF
The URI line that follows the EXT-X-STREAM-INF tag specifies a Media
Playlist that carries a Rendition of the Variant Stream. The URI
line is REQUIRED. Clients that do not support multiple video
Renditions SHOULD play this Rendition.
#EXT-X-STREAM-INF:<attribute-list>
<URI>
BANDWIDTH
AVERAGE-BANDWIDTH
SCORE
CODECS
SUPPLEMENTAL-CODECS
RESOLUTION
FRAME-RATE
HDCP-LEVEL
ALLOWED-CPC
VIDEO-RANGE
REQ-VIDEO-LAYOUT
The client SHOULD assume that the order of entries reflects the
most common presentation in the content. For example, if the
content is predominantly stereoscopic, with some brief sections
that are monoscopic then the Multivariant Playlist SHOULD specify
REQ-VIDEO-LAYOUT="CH-STEREO,CH-MONO". On the other hand, if the
content is predominantly monoscopic then the Multivariant Playlist
SHOULD specify REQ-VIDEO-LAYOUT="CH-MONO,CH-STEREO"".
STABLE-VARIANT-ID
AUDIO
VIDEO
SUBTITLES
CLOSED-CAPTIONS
PATHWAY-ID
The URI attribute of the EXT-X-MEDIA tag MUST NOT be included if the
media type is CLOSED-CAPTIONS.
4.4.6.3. EXT-X-I-FRAME-STREAM-INF
#EXT-X-I-FRAME-STREAM-INF:<attribute-list>
URI
4.4.6.4. EXT-X-SESSION-DATA
#EXT-X-SESSION-DATA:<attribute-list>
DATA-ID
VALUE
URI
FORMAT
LANGUAGE
4.4.6.5. EXT-X-SESSION-KEY
#EXT-X-SESSION-KEY:<attribute-list>
All attributes defined for the EXT-X-KEY tag (Section 4.4.4.4) are
also defined for the EXT-X-SESSION-KEY, except that the value of the
METHOD attribute MUST NOT be NONE. If an EXT-X-SESSION-KEY is used,
the values of the METHOD, KEYFORMAT, and KEYFORMATVERSIONS attributes
MUST match any EXT-X-KEY with the same URI value.
4.4.6.6. EXT-X-CONTENT-STEERING
#EXT-X-CONTENT-STEERING:<attribute-list>
SERVER-URI
PATHWAY-ID
5. Key Files
6. Client/Server Responsibilities
6.1. Introduction
This section describes how the server generates the Playlist and
Media Segments and how the client should download them for playback.
The server MUST divide the source media into individual Media
Segments whose duration (when rounded to a whole second) is less than
or equal to the Target Duration. Segments longer than that can
trigger playback stalls and other errors.
The server SHOULD attempt to divide the source media at points that
support effective decode of individual Media Segments, such as on
packet and key frame boundaries.
The server MUST create a URI for every Media Segment that enables its
clients to obtain the segment data. If a server supports partial
loading of resources (e.g., via HTTP Range requests), it MAY specify
segments as sub-ranges of larger resources using the EXT-X-BYTERANGE
tag.
The absence of media data (due to, for example, the temporary
unavailability of an encoder) SHOULD be signaled by adding one or
more Media Segments to the Playlist whose Segment durations add up to
the duration of absent media; these Media Segments MUST have EXT-
X-GAP tags applied to them. Similarly, such Partial Segments MUST
have a GAP=YES attribute. Attempting to download these segments MAY
produce an error, such as HTTP 404 or 410.
Changes to the Playlist file MUST be made atomically from the point
of view of the clients, or playback errors MAY occur.
The server MUST NOT change the Media Playlist file, except to:
Remove Media Segment URIs from the Playlist in the order that they
appear, along with any tags that apply only to those segments
(Section 6.2.2).
Playlist changes other than those allowed here can trigger playback
errors and inconsistent client behavior.
The server MAY associate an absolute date and time with a Media
Segment by applying an EXT-X-PROGRAM-DATE-TIME tag to it. This
defines an informative mapping of the (wall-clock) date and time
specified by the tag to the first media timestamp in the segment,
which may be used as a basis for seeking, for display, or for other
purposes. If a server provides this mapping, it SHOULD apply an EXT-
X-PROGRAM-DATE-TIME tag to every segment that has an EXT-
X-DISCONTINUITY tag applied to it.
EXT-X-PART tags SHOULD be removed from the Playlist after they are
greater than three Target Durations from the end of the Playlist.
Clients MUST be able to download the Partial Segment for at least
three Target Durations after the EXT-X-PART tag is removed from the
Playlist.
Media Segments and EXT-X-PART tags MUST be removed from the Playlist
in the order that they appear in the Playlist; otherwise, client
playback can malfunction.
The server MUST NOT remove a Media Segment from a Playlist file
without an EXT-X-ENDLIST tag if that would produce a Playlist whose
duration is less than three times the Target Duration. Doing so can
trigger playback stalls.
The server MAY set the HTTP Expires header in the key response to
indicate the duration for which the key can be cached.
If the encryption METHOD is AES-128 and the Playlist does not contain
the EXT-X-I-FRAMES-ONLY tag, AES encryption as described in
Section 4.4.4.4 SHALL be applied to individual Media Segments.
The server MUST NOT remove an EXT-X-KEY tag from the Playlist file if
it applies to any Media Segment in the Playlist file, or clients who
subsequently load that Playlist will be unable to decrypt those Media
Segments.
The server MUST meet the following constraints when producing Variant
Streams in order to allow clients to switch between them seamlessly:
Each Media Playlist in each Variant Stream MUST have the same
Target Duration. The only exceptions are SUBTITLES Renditions and
Media Playlists containing an EXT-X-I-FRAMES-ONLY tag, which MAY
have different Target Durations if they have an EXT-X-PLAYLIST-
TYPE of VOD.
When the _HLS_skip directive has a value of v2, the Playlist Delta
Update additionally MUST NOT contain EXT-X-DATERANGE tags that were
added to the Playlist more than CAN-SKIP-UNTIL seconds before the
Playlist request. The RECENTLY-REMOVED-DATERANGES attribute of the
EXT-X-SKIP tag MUST list the date ranges that were removed from the
Playlist within CAN-SKIP-UNTIL seconds of the Playlist request.
All tags that were not skipped MUST remain in the Playlist Delta
Update.
A Server MUST ignore the _HLS_skip directive if the Playlist does not
contain the CAN-SKIP-UNTIL attribute, or if it contains an EXT-
X-ENDLIST tag.
If the Client requests a Part Index greater than that of the final
Partial Segment of the Parent Segment, the Server MUST treat the
request as one for Part Index 0 of the following Parent Segment.
The Server MUST deliver the entire Playlist, even if the requested
Media Segment is not the last one in the Playlist, and even if it is
no longer in the Playlist.
If the _HLS_msn is greater than the Media Sequence Number of the last
Media Segment in the current Playlist plus two, or if the _HLS_part
exceeds the last Partial Segment in the current Playlist by the
Advance Part Limit, then the server SHOULD immediately return Bad
Request, such as HTTP 400. The Advance Part Limit is three divided
by the Part Target Duration if the Part Target Duration is less than
one second, or three otherwise.
The Server SHOULD NOT hint a byte range that it does not expect its
clients to require in the near term.
The server SHOULD respond with "Not Found" (such as HTTP 404) to a
request for a resource that it cannot find and that is not specified
by an EXT-X-PRELOAD-HINT tag in an active Media Playlist.
The Server SHOULD NOT add more than one EXT-X-PRELOAD-HINT tag with
the same TYPE to a Playlist.
How the client obtains the URI to the Playlist file is outside the
scope of this document; it is presumed to have done so.
The client obtains the Playlist file from the URI. If the Playlist
file so obtained is a Multivariant Playlist, the client can select a
Variant Stream to load from the Multivariant Playlist.
Clients MUST ensure that loaded Playlists comply with Section 4 and
that the EXT-X-VERSION tag, if present, specifies a protocol version
supported by the client; if either check fails, the client MUST NOT
attempt to use the Playlist, or unintended behavior could occur.
When all Variant Streams have a SCORE attribute, the client SHOULD
use the SCORE value to choose a Variant Stream after all other
playability constraints have been applied. If several Variant
Streams have the highest SCORE value then other criteria MAY be used
to chose among them.
A client MAY use the segment Media Sequence Number to track the
location of a Media Segment within a Playlist when the Playlist is
reloaded.
A client MUST NOT assume that segments with the same Media Sequence
Number in different Variant Streams or Renditions have the same
position in the presentation; Playlists MAY have independent Media
Sequence Numbers. Instead, a client MUST use the relative position
of each segment on the Playlist timeline and its Discontinuity
Sequence Number to locate corresponding segments.
The client SHALL choose which Media Segment to play first from the
Media Playlist when playback starts. If the EXT-X-ENDLIST tag is not
present and the client intends to play the media normally, the client
SHOULD NOT choose a segment closer to the end of the Playlist than
described by the HOLD-BACK and PART-HOLD-BACK attributes. Doing so
can trigger playback stalls.
The client SHOULD NOT attempt to load Media Segments that have been
marked with an EXT-X-GAP tag, or to load Partial Segments with a
GAP=YES attribute. Instead, clients are encouraged to look for
another Variant Stream of the same Rendition which does not have the
same gap, and play that instead.
Note that dates in Playlists can refer to when the content was
produced (or to other times), which have no relation to the time of
playback.
However, the client MUST NOT attempt to reload the Playlist file more
frequently than specified by this section, in order to limit the
collective load on the server.
When a client loads a Playlist file for the first time or reloads a
Playlist file and finds that it has changed since the last time it
was loaded, the client MUST wait for at least the duration of the
last segment in the Playlist before attempting to reload the Playlist
file again, measured from the last time the client began loading the
Playlist file.
If the client reloads a Playlist file and finds that it has not
changed, then it MUST wait for a period of one-half the Target
Duration before retrying. If the Playlist file remains unchanged
when reloaded and it has been at least 1.5 times the Target Duration
since the last time the client loaded a changed Playlist then the
client MAY conclude that the server is not behaving properly and
switch to a different Variant Stream or trigger a playback error.
After reloading a Media Playlist, the client SHOULD verify that each
Media Segment in it has the same URI (and byte range, if specified)
as the Media Segment with the same Media Sequence Number in the
previous Media Playlist. It SHOULD halt playback if it does not, as
this normally indicates a server error.
In order to reduce server load, the client SHOULD NOT reload the
Playlist files of Variant Streams or alternate Renditions that are
not currently being played. If it decides to switch playback to a
different Variant Stream, it SHOULD stop reloading the Playlist of
the old Variant Stream and begin loading the Playlist of the new
Variant Stream. It can use the EXTINF durations and the constraints
in Section 6.2.4 to determine the approximate location of
corresponding media. Once media from the new Variant Stream has been
loaded, the timestamps in the Media Segments can be used to
synchronize the old and new timelines precisely.
The client MUST examine the Media Playlist file every time it is
loaded or reloaded to determine the next Media Segment to load, as
the set of available media MAY have changed.
The first segment to load is generally the segment that the client
has chosen to play first (see Section 6.3.3).
A client MUST NOT attempt to decrypt any segments whose EXT-X-KEY tag
has a METHOD attribute that it does not recognize.
The widened byte range can then be loaded and decrypted with AES-128
CBC using an arbitrary IV. The number of bytes added to the
beginning and the end of the original byte range are discarded from
the decrypted bytes; what remains is the decrypted I-frame.
The client can request a Playlist Delta Update that skips older Media
Segments by adding an "_HLS_skip=YES" directive to the Media Playlist
URI when it requests the Playlist.
A Client MUST merge the contents of a Playlist Delta Update with its
previous version of the Playlist to form an up-to-date version of the
Playlist. If a Client receives a Playlist containing an EXT-X-SKIP
tag and finds that it does not already have all of the information
that was skipped, it MUST obtain a complete copy of the Playlist by
reissuing its Playlist request without the _HLS_skip directive.
7. Content Steering
{
"VERSION": number, // REQUIRED, must be an integer
"TTL": number, // REQUIRED, number of seconds
"RELOAD-URI": string, // OPTIONAL, URI
"PATHWAY-PRIORITY": // REQUIRED, array of Pathway IDs
[
One or more Pathway IDs in order of preference
],
"PATHWAY-CLONES": // OPTIONAL, array of Pathway Clone objects
[
One or more Pathway Clone objects. See Section 7.2.
]
}
A client MUST ignore any key of the Steering Manifest that it does
not recognize. Note that manifest keys are case-sensitive.
The TTL specifies how many seconds the client MUST wait before
reloading the Steering Manifest. The recommended value is 300
seconds (5 minutes). The Steering Server MAY vary the TTL by client
to distribute server load.
The RELOAD-URI, if present, specifies the URI the client MUST use the
next time it obtains the Steering Manifest. The RELOAD-URI MAY be
relative to the current Steering Manifest URI. Certain URI schemes
(such as "data") cannot act as base URIs for relative URIs.
Attempting to specify a relative URI in that case will produce an
error.
{
"BASE-ID": string, // REQUIRED. Pathway ID of the Base Pathway
"ID": string, // REQUIRED. Pathway ID for the Pathway Clone
"URI-REPLACEMENT": // REQUIRED. URI replacement rules
{
"HOST": string, // OPTIONAL. Hostname for cloned URIs
"PARAMS": // OPTIONAL. Query parameters for cloned URIs
{
JSON object where keys are query parameter names
and values are query parameter values
},
"PER-VARIANT-URIS": // OPTIONAL. URI overrides per Variant Stream
{
JSON object where keys are STABLE-VARIANT-ID strings
and values are replacement absolute URIs
},
"PER-RENDITION-URIS": // OPTIONAL. URI overrides per Rendition
{
JSON object where keys are STABLE-RENDITION-ID strings
and values are replacement absolute URIs
}
}
}
Set the ID of the new Pathway to the Pathway Clone ID string. For
every Rendition URI in the new Pathway, resolve it against its
base if necessary and then replace its hostname with the Pathway
Clone HOST string (if present).
The client sends a request with the Steering Manifest URI to obtain
the Steering Manifest. It SHOULD add the following query parameters
to the URI:
_HLS_pathway="<CURRENT-PATHWAY-ID>"
_HLS_throughput=<THROUGHPUT>
3. If all the Variant Streams from the current Pathway fail with a
network error, mark the current Pathway as penalized, and perform
a Content Steering evaluation (step 5).
4. If the client decides that the Pathway has been penalized long
enough that it may have recovered, it SHOULD un-penalize the
Pathway and perform a Content Steering evaluation (step 5).
* The EXT-X-MAP tag in a Media Playlist that does not contain EXT-
X-I-FRAMES-ONLY.
* Variable substitution.
The EXT-X-MEDIA tag and the AUDIO, VIDEO, and SUBTITLES attributes of
the EXT-X-STREAM-INF tag are backward compatible to protocol version
1, but playback on older clients may not be desirable. A server MAY
consider indicating an EXT-X-VERSION of 4 or higher in the
Multivariant Playlist but is not required to do so.
9. Playlist Examples
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
#EXT-X-ENDLIST
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:8
#EXT-X-MEDIA-SEQUENCE:2680
#EXTINF:7.975,
https://priv.example.com/fileSequence2680.ts
#EXTINF:7.941,
https://priv.example.com/fileSequence2681.ts
#EXTINF:7.975,
https://priv.example.com/fileSequence2682.ts
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:7794
#EXT-X-TARGETDURATION:15
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=52"
#EXTINF:2.833,
http://media.example.com/fileSequence52-A.ts
#EXTINF:15.0,
http://media.example.com/fileSequence52-B.ts
#EXTINF:13.333,
http://media.example.com/fileSequence52-C.ts
#EXT-X-KEY:METHOD=AES-128,URI="https://priv.example.com/key.php?r=53"
#EXTINF:15.0,
http://media.example.com/fileSequence53-A.ts
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000
http://example.com/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,AVERAGE-BANDWIDTH=2000000
http://example.com/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AVERAGE-BANDWIDTH=6000000
http://example.com/hi.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"
http://example.com/audio-only.m3u8
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000
low/audio-video.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=86000,URI="low/iframe.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2560000
mid/audio-video.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=150000,URI="mid/iframe.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=7680000
hi/audio-video.m3u8
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=550000,URI="hi/iframe.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"
audio-only.m3u8
In this example, the CODECS attributes have been condensed for space.
#EXTM3U
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="English", \
DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="en", \
URI="main/english-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Deutsch", \
DEFAULT=NO,AUTOSELECT=YES,LANGUAGE="de", \
URI="main/german-audio.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aac",NAME="Commentary", \
DEFAULT=NO,AUTOSELECT=NO,LANGUAGE="en", \
URI="commentary/audio-only.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",AUDIO="aac"
low/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",AUDIO="aac"
mid/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",AUDIO="aac"
hi/video-only.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5",AUDIO="aac"
main/english-audio.m3u8
In this example, the CODECS attributes have been condensed for space.
#EXTM3U
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Main", \
DEFAULT=YES,URI="low/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Centerfield", \
DEFAULT=NO,URI="low/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="low",NAME="Dugout", \
DEFAULT=NO,URI="low/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,CODECS="...",VIDEO="low"
low/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Main", \
DEFAULT=YES,URI="mid/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Centerfield", \
DEFAULT=NO,URI="mid/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="mid",NAME="Dugout", \
DEFAULT=NO,URI="mid/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2560000,CODECS="...",VIDEO="mid"
mid/main/audio-video.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Main", \
DEFAULT=YES,URI="hi/main/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Centerfield", \
DEFAULT=NO,URI="hi/centerfield/audio-video.m3u8"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="hi",NAME="Dugout", \
DEFAULT=NO,URI="hi/dugout/audio-video.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=7680000,CODECS="...",VIDEO="hi"
hi/main/audio-video.m3u8
#EXT-X-SESSION-DATA:DATA-ID="com.example.lyrics",URI="lyrics.json"
#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="en", \
VALUE="This is an example"
#EXT-X-SESSION-DATA:DATA-ID="com.example.title",LANGUAGE="es", \
VALUE="Este es un ejemplo"
CHARACTERISTICS=
"public.accessibility.transcribes-spoken-dialog,public.easy-to-read"
#EXTM3U
...
#EXT-X-DATERANGE:ID="splice-6FFFFFF0", \
START-DATE="2014-03-05T11:15:00Z",PLANNED-DURATION=59.993, \
SCTE35-OUT=0xFC002F000000000000FF000014056FFFFFF000E081622DCAFF0 \
00052636200000000000A0008029896F50000008700000000
#EXT-X-DATERANGE:ID="splice-6FFFFFF0",DURATION=59.993, \
SCTE35-IN=0xFC002A000000000000FF00000F056FFFFFF000408162802E610 \
0000000000A0008029896F50000008700000000
...
#EXTM3U
#EXT-X-TARGETDURATION:4
...
#EXTINF:4.00008,
fileSequence268.mp4
#EXTINF:4.00008,
fileSequence269.mp4
#EXTINF:4.00008,
fileSequence270.mp4
#EXT-X-PART:DURATION=2.00004,INDEPENDENT=YES,URI="filePart271.0.mp4"
#EXT-X-PART:DURATION=2.00004,URI="filePart271.1.mp4"
#EXTINF:4.00008,
fileSequence271.mp4
#EXT-X-PART:DURATION=2.00004,INDEPENDENT=YES,URI="filePart272.0.mp4"
#EXT-X-PART:DURATION=0.50001,URI="filePart272.1.mp4"
#EXTINF:2.50005,
fileSequence272.mp4
#EXT-X-DISCONTINUITY
#EXT-X-PART:DURATION=2.00004,INDEPENDENT=YES,URI="midRoll273.0.mp4"
#EXT-X-PART:DURATION=2.00004,URI="midRoll273.1.mp4"
#EXTINF:4.00008,
midRoll273.mp4
#EXT-X-PART:DURATION=2.00004,INDEPENDENT=YES,URI="midRoll274.0.mp4"
#EXT-X-PRELOAD-HINT:TYPE=PART,URI="midRoll274.1.mp4"
#EXT-X-RENDITION-REPORT:URI="/1M/LL-HLS.m3u8",LAST-MSN=274,LAST-PART=1
#EXTM3U
#EXT-X-CONTENT-STEERING:SERVER-URI="/steering?video=00012", \
PATHWAY-ID="CDN-A"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="A",NAME="English",DEFAULT=YES, \
URI="eng.m3u8",LANGUAGE="en",STABLE-RENDITION-ID="Audio-37262"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="B",NAME="ENGLISH",DEFAULT=YES, \
URI="https://b.example.com/content/videos/video12/eng.m3u8", \
LANGUAGE="en",STABLE-RENDITION-ID="Audio-37262"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AUDIO="A",PATHWAY-ID="CDN-A", \
STABLE-VARIANT-ID="Video-128"
low/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AUDIO="A",PATHWAY-ID="CDN-A", \
STABLE-VARIANT-ID="Video-768"
hi/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AUDIO="B",PATHWAY-ID="CDN-B", \
STABLE-VARIANT-ID="Video-128"
https://backup.example.com/content/videos/video12/low/video.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=7680000,AUDIO="B",PATHWAY-ID="CDN-B", \
STABLE-VARIANT-ID="Video-768"
https://backup.example.com/content/videos/video12/hi/video.m3u8
{
"VERSION": 1,
"TTL": 300,
"RELOAD-URI": "https://example.com/steering?video=00012&session=123",
"PATHWAY-PRIORITY": [
"CDN-A",
"CDN-B"
]
}
{
"VERSION": 1,
"TTL": 300,
"PATHWAY-PRIORITY": [
"CDN-A-CLONE",
"CDN-A"
],
"PATHWAY-CLONES": [
{
"BASE-ID": "CDN-A",
"ID": "CDN-A-CLONE",
"URI-REPLACEMENT":
{
"HOST": "backup2.example.com",
"PARAMS":
{
"token": "dkfs1239414"
}
"PER-RENDITION-URIS": {
"Audio-37262": "https://q.example.com/video12/eng.m3u8"
}
}
}
]
}
https://backup2.example.com/videos/video12/low/video.m3u8?token=dkfs1239414
https://backup2.example.com/videos/video12/hi/video.m3u8?token=dkfs1239414
https://q.example.com/video12/eng.m3u8
10. Contributors
11.1. vnd.apple.mpegurl
Additional information:
11.2. vnd.apple.steering-list
Additional information:
Since the protocol generally uses HTTP to transfer data, most of the
same security considerations apply. See Section 15 of HTTP
[RFC9112].
Playlist files contain URIs, which clients will use to make network
requests of arbitrary entities. Clients SHOULD range-check responses
to prevent buffer overflows. See also the Security Considerations
section of "Uniform Resource Identifier (URI): Generic Syntax"
[RFC3986].
Apart from URI resolution, this format does not employ any form of
active content.
13. References
[COMMON_ENC]
International Organization for Standardization,
"Information technology -- MPEG systems technologies --
Part 7: Common encryption in ISO base media file format
files", ISO/IEC International Standard 23001-7:2016,
February 2016, <http://www.iso.org/iso/
catalogue_detail.htm?csnumber=68042>.
[ISO_13818]
International Organization for Standardization, "Generic
coding of moving pictures and associated audio
information", ISO/IEC International Standard 13818:2007,
October 2007,
<http://www.iso.org/iso/catalogue_detail?csnumber=44169>.
[ISO_13818_3]
International Organization for Standardization, "Generic
coding of moving pictures and associated audio information
-- Part 3: Audio", ISO/IEC International
Standard 13818-3:1998, April 1998,
<http://www.iso.org/iso/home/store/catalogue_tc/
catalogue_detail.htm?csnumber=26797>.
[ISO_13818_7]
International Organization for Standardization, "Generic
coding of moving pictures and associated audio information
-- Part 7: Advanced Audio Coding (AAC)", ISO/IEC
International Standard 13818-7:2006, January 2006,
<http://www.iso.org/iso/home/store/catalogue_tc/
catalogue_detail.htm?csnumber=43345>.
[ISO_14496]
International Organization for Standardization,
"Information technology -- Coding of audio-visual objects
-- Part 3: Audio", ISO/IEC International
Standard 14496-3:2009, 2009,
<http://www.iso.org/iso/catalogue_detail?csnumber=53943>.
[MP4_TIMED_TEXT]
International Organization for Standardization,
"Information technology -- Coding of audio-visual objects
-- Part 30: Timed text and other visual overlays in ISO
base media file format", ISO/IEC International
Standard 14496-30:2014, March 2014,
<https://www.iso.org/standard/63107.html>.
[RFC2018] Mathis, M., Mahdavi, J., Floyd, S., and A. Romanow, "TCP
Selective Acknowledgment Options", RFC 2018,
DOI 10.17487/RFC2018, October 1996,
<https://www.rfc-editor.org/info/rfc2018>.
[RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
September 2009, <https://www.rfc-editor.org/info/rfc5646>.
[RFC6381] Gellens, R., Singer, D., and P. Frojdh, "The 'Codecs' and
'Profiles' Parameters for "Bucket" Media Types", RFC 6381,
DOI 10.17487/RFC6381, August 2011,
<https://www.rfc-editor.org/info/rfc6381>.
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
Interchange Format", STD 90, RFC 8259,
DOI 10.17487/RFC8259, December 2017,
<https://www.rfc-editor.org/info/rfc8259>.
[RFC8673] Pratt, C., Thakore, D., and B. Stark, "HTTP Random Access
and Live Content", RFC 8673, DOI 10.17487/RFC8673,
November 2019, <https://www.rfc-editor.org/info/rfc8673>.
[RFC8985] Cheng, Y., Cardwell, N., Dukkipati, N., and P. Jha, "The
RACK-TLP Loss Detection Algorithm for TCP", RFC 8985,
DOI 10.17487/RFC8985, February 2021,
<https://www.rfc-editor.org/info/rfc8985>.
[RFC9113] Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113,
DOI 10.17487/RFC9113, June 2022,
<https://www.rfc-editor.org/info/rfc9113>.
[WebVTT] World Wide Web Consortium (W3C), "WebVTT: The Web Video
Text Tracks Format", <https://www.w3.org/TR/webvtt1/>.
[WebVTT-metadata-header]
World Wide Web Consortium (W3C), "WebVTT: The Web Video
Text Tracks Format -- W3C Working Draft", December 2015,
<https://www.w3.org/TR/2015/WD-webvtt1-20151208/#webvtt-
metadata-header>. HTTP Live Streaming added a WebVTT
metadata header in 2012. When the concept was removed
from the WebVTT specification in 2016, there was already
substantial content making use of it.
[SampleEnc]
Apple Inc., "MPEG-2 Stream Encryption Format for HTTP Live
Streaming",
<https://developer.apple.com/library/ios/documentation/
AudioVideo/Conceptual/HLS_Sample_Encryption/>.
Several changes have been made since the publication of RFC 8216
[RFC8216].
The minimum new segment publication latency has been removed from
server timing model.
The definition of peak segment bit rate was changed to ensure every
segment is included in at least one contiguous set.
HTTP caches used to deliver Playlists or Segments will set the Age
HTTP Response header.
The recommended GOP size is between one and two seconds. Smaller
GOPs allow faster switching between Renditions.
1. Send a request for the Media Playlist that does not include an
_HLS_msn or _HLS_part directive.
4. While the Age value is greater than or equal to the floor of the
Part Target Duration:
E. Update the current Playlist and the Age value from the
Playlist response.
Appendix D. Interstitials
D.1. Overview
X-ASSET-URI
X-ASSET-LIST
X-RESUME-OFFSET
X-PLAYOUT-LIMIT
X-SNAP
If the list contains OUT then the client SHOULD locate the segment
boundary closest to the START-DATE of the interstitial in the
Media Playlist of the primary content and transition to the
interstitial at that boundary. If more than one Media Playlist is
contributing to playback (audio plus video for example), the
client SHOULD transition at the earliest segment boundary.
If the list contains IN then the client SHOULD locate the segment
boundary closest to the scheduled resumption point from the
interstitial in the Media Playlist of the primary content and
resume playback of primary content at that boundary. If more than
one Media Playlist is contributing to playback, the client SHOULD
transition at the latest segment boundary.
X-RESTRICT
If the list contains JUMP then the client MUST NOT allow the user
to seek from a position in the primary asset earlier than the
START-DATE attribute to a position after it without first playing
the interstitial asset, even if the interstitial at START-DATE was
played through earlier. If the user attempts to seek across more
than one interstitial, the client SHOULD choose at least one
interstitial to play before allowing the seek to complete.
X-CONTENT-MAY-VARY
X-TIMELINE-OCCUPIES
X-TIMELINE-STYLE
X-<client-attribute>
Multiple interstitials that are scheduled for the same time SHOULD be
played in the order that their EXT-X-DATERANGE tags appear in the
Playlist. In that case, X-RESUME-OFFSET values are cumulative.
Multiple interstitials that are scheduled for the same time MUST
occur in the same order in all Media Playlists of a Multivariant
Playlist.
If the JSON object returned by the asset list URI has an empty array
as the value of the "ASSETS" key, the client SHOULD apply the resume
offset without playing any interstitial content.
#EXTM3U
#EXT-X-TARGETDURATION:6
#EXT-X-PROGRAM-DATE-TIME:2020-01-02T21:55:40.000Z
#EXTINF:6,
main1.0.ts
#EXT-X-ENDLIST
#EXT-X-DATERANGE:ID="ad1",CLASS="com.apple.hls.interstitial",
START-DATE="2020-01-02T21:55:44.000Z",DURATION=15.0,
X-ASSET-URI="http://example.com/ad1.m3u8",X-RESUME-OFFSET=0,
X-RESTRICT="SKIP,JUMP",X-COM-EXAMPLE-BEACON=123
This means the client needs a process for creating display names.
This section defines one possible process. There are two stages to
the process. The first stage, Base Name Selection, determines the
base display name either via lookup or by synthesizing it from
attributes (especially LANGUAGE). The second stage, Name Decoration,
augments the base display name based on other attributes (especially
CHARACTERISTICS). For example, Name Decoration can be used to
distinguish Renditions offering Audio Description from those that
don't.
#EXT-X-SESSION-DATA:DATA-ID="_hls.localized-rendition-names",URI="<JSON-URI>"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AAC",NAME="English", \
LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,URI="index-en.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AAC",NAME="Director's commentary", \
LANGUAGE="en",DEFAULT=NO,AUTOSELECT=NO,URI="dc-en.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AAC",NAME="Deutsch", \
LANGUAGE="de",DEFAULT=NO,AUTOSELECT=YES,URI="index-de.m3u8"
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="AAC",NAME="Kommentar des Regisseurs", \
LANGUAGE="de",DEFAULT=NO,AUTOSELECT=NO,URI="dc-de.m3u8"
{
"Director's commentary" :
{
"en" : "Director's commentary",
"de" : "Kommentar des Regisseurs"
},
"Kommentar des Regisseurs" :
{
"en" : "Director's commentary",
"de" : "Kommentar des Regisseurs"
}
}
The dictionary omits entries for the NAMEs "English" and "Deutsch"
because they are primary renditions. Name Decoration should replace
the name with the correct localization. For example, "Englisch"
instead of "English" in a German locale and "German" instead of
"Deutsch" in an English locale.
Author's Address