我为什么要干这种事

Introduction to HTTP Live Streaming

1 OVerview

Multimedia presentation : specified by a Uniform Resource Identifier (URI) [RFC3986] to a Playlist.

Playlist : either a Media Playlist or a Master Playlist. Both are UTF-8 text files containing URIs and descriptive tags.

A Media Playlist contains a list of Media Segments, which when played sequentially will play the multimedia presentation.

2 An example of a Media Playlist

   #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

#EXTM3U 格式标识符。#EXT-X-TARGETDURATION all Media Segments last 10s long or less. #EXTINF 声明各个segment的时长。

更为复杂的情况是:声明一个 Master Playlist, 此Master Playlist 中包含一系列相同内容的不同version的Variant Stream。

一个Variant Stream 包含了一个 Media Playlist ,后者声明了 Media 内容的属性:编码,比特率,格式,视频分辨率等。

一个Variant Stream 也规定了Rendition的集合。Renditions are alternate versions of the content。比如不同语言的音频或者不同角度拍摄的视频。

客户端需要根据网络情况切换不同的Stream。

3 Media Segments

A Media Playlist contains a series of Media Segments which make up the overall presentation. A Media Segment is specified by a URI and optionally a byte range.

标签EXTINF 表明了每个 Media Segment的duration。Playlist 中的每个segment 都有一个序号,要么是0,要么由Playlist定义(标签EXT-X-MEDIA-SEQUENCE 定义了第一个segment的序号)。该序号递增加一。

每个Segment必须携带与其前一个序号segment连续的 encoded bitstream。 比如:时间戳,连续性计数器等都必须保持不中断。只有第一个segment是例外(标签EXT-X-DISCONTINUITY表明 the Segment之后与其存在不连续的现象)。未标签的media 中断可触发playback 错误。

3.1 Supported Media Segment Formats

所有 Media Segment 必须采用本节中描述的格式。

在media segment可以被parsed之前,一些media formats 需要一个共同的字节序列来初始化parser。这种 format-specific-sequence称为Media Initialization Section(标签EXT-X-MAP定义该项)。Media Initialization Section 不可以包含Sample data。

3.2 MPEG-2 Transport Streams

MPEG-2 传输协议定义于[ ISO-3818 ]。MPEG-2 传输协议的 Media Initialization Section 是在

Program Map Table (PMT)后面的Program Association Table (PAT)。

Transport Stream Segments MUST contain a single MPEG-2 Program; Playback of Multi-Program Transport Streams is not defined。每 Transport Stream Segment 都必须包含一个PAT和PMT,或者有一个 EXT-X-MAP标签。在没有EXT-X-MAP标签的segment中,前两个传输流数据包应该是一个PAT和一个PMT。

Fragmented MPEG-4

MPEG-4 Fragments 定义于 ISO Base Media File Format [ ISOBMFF ]。与包含示sample table 的 Movie Box("moov")以及包含相应sample的 Media Data Box ("mdat") 的常规 MPEG-4 文件不同,MPEG-4 片 Segment 由包含sample table子集的Movie Fragment Box ("moof") 和这些sample的Media Data Box组成。使用 MPEG-4 片 Segment 确实需要 Movie Box 进行初始化,但 Movie Box 仅包含非特定于sample(non-sample-specific)的信息,如track和sample descriptions。

fMP4 segment的Media Initialization Section是一个 ISO 基本 Media 文件,可以初始化该 Segment 的解析器。

从广义上讲,fMP4 segment和Media Initialization Section是文件,也满足本文中描述的约束部分。

一个 fMP4 Segment的 Media Initialization Section 必须包含一个 File Type Box(ftyp),其包含了一个兼容 iso6或者更高的brand。 ftyp 必须跟随一个Movie Box(moov)。 对于每一Track Fragment Box(traf),其和track_id 对应,该moov必须包含一个Track Box(trak)。每个trak可以(should)包含一个sample table,但其sample count 必须为0。Movie Header Boxes ('mvhd') 和 Track Header Boxes(tkhd) 的duration必须为0。 一个Movie Extends Box(mvex)应该在最后一个trak后面。一个 CMAF Header [ CMAF ] 满足所有这些要求。

在一个 fMP4 Segment中每个traf应该有一个Track Fragment Decode Time Box(tfdt)。 fMP4 Segment 必须使用movie-fragment 相对地址。不能使用外部地址引用。一个 CMAF Header [ CMAF ] 满足所有这些要求。

Playlist中包含 EXT-X-I-FRAME-ONLY 标签的 fMP4 Segment 可能会省略mdat的 I 帧sample data 之后的部分。

Playlist中的每个 fMP4 segment都必须应用 EXT-X-MAP 标签。

3.4 Packed Audio

一个Packed Audio Segment 包含编码的音频样本和 ID3 标签,它们只需与最小帧和no per-sample时间戳一起打包即可。支持的Packed Audio 格式包括:AAC with ADTS framing [ ISO_13818_7 ] ,MP3 [ ISO_13818_3 ]; AC - 3 [ AC_3 ];Echanced AC - 3 [ AC_3 ]。

一个Packed Audio Segment 没有Media Initialization Section。

每个Packed Audio Segment必须在segment最开始使用一个 ID3 PRIV 标签说明其第一个sample的时间戳。ID3 PRIV 所有者标识符必须为"com.apple.streaming.transportStreamTimestamp"。ID3 有效负载必须是 33 位 MPEG-2 Program Elementary Stream 时间戳,以大端八字节数表示, 高 31 位置为零。

客户端不应播放没有此 ID3 标签的 Packed Audio segments。

WebVTT

WebVTT segment 是一个webVTT [ webVTT ] 的一部分。其携带subtitles。

WebVTT segment 的 Media Initialization Section 是 WebVTT header。

每个 WebVTT segment必须包含所有 subtitle 提示(cues),这些提示要在segment 的 EXTINF 持续时间的时间 Segment 内显示。每个提示的开始时间偏移和结束时间偏移必须指示该提示的总显示时间,即使提示时间范围的一部分超出" Segment "周期也是如此。WebVTT segment可能不包含任何提示;这表示在此期间不会显示任何subtle。

每个 WebVTT segment必须从 WebVTT header开始,或者应用 EXT-X-MAP标签。

为了同步音频/视频和字幕之间的时间戳,应为每个 WebVTT header添加 X-TIMESTAMP-MAP元数据标头。This header maps WebVTT cue timestamps to MPEG-2 (PES) timestamps in other Renditions of the Variant Stream. 格式为:

   X-TIMESTAMP-MAP=LOCAL:<cue time>,MPEGTS:<MPEG-2 time>
e.g. X-TIMESTAMP-MAP=LOCAL:00:00:00.000,MPEGTS:900000

LOCAL 属性中的提示时间戳可能超出 segment 覆盖的时间范围。

如果 WebVTT Segment 没有 X-TIMESTAMP-MAP,则客户端必须假定 WebVTT 提示时间 0 映射到 MPEG-2 时间戳 0。

4. Playlists

本节介绍 HTTP HTTP Live Streaming 处理使用的 Playlist 文件。 在本节中,"MUST"和"MUST NOT"指定合法的 Playlist 文件的语法和结构的规则。 违反这些规则的Playlist无效;客户端必须解析失败。See Section 6.3.2.

Playlist 文件的格式派生自 M3U 的Playlist 文件格式,并从该早期文件格式继承了两个标签:EXTM3U(第 4.3.1.1 节)和 EXTINF(第 4.3.2.1 节)。

每个 Playlist 文件必须通过其 URI 的路径组件或 HTTP 内容类型来识别。在第一种情况下,路径必须以 .m3u8 或 .m3u 结尾。 在第二个中,HTTP 内容类型必须是 "application/vnd.apple.mpegurl" 或 "audio/mpegurl" 。客户端应拒绝分析未如此标识的Playlist。

4.1 Definition of a Playlist

Playlist 文件必须以 UTF-8 编码。 它们不得包含任何BOM;客户端应拒绝包含 BOM 的Playlist ,或者不解析为 UTF-8。 Playlist 列表文件不得包含 UTF-8 控制字符(U+0000 到 U+001F 和 U+007F 到 U+009F),CR (U+000D) 和 LF (U+000A)除外。 所有字符序列必须根据Unicode规范化形式“NFC”进行规范化。 请注意,US-ASCII [US_ASCII]符合这些规则。

Playlist 文件中的行由单个换行符\n或回车符\r后跟换行符终止。 每行都是URI,空白或以字符“#”开头。 空行被忽略。 除了明确指定的元素外,不得出现空格。

以字符“#”开头的行是注释或标签。 标签以#EXT开头。 它们区分大小写。 所有其他以'#'开头的行都是注释,应该被忽略。

一个URI行表明一个 Media Segment 或一个 Playlist 文件(请参阅第4.3.4.2节)。 每个 Media Segment 由URI和适用于它的标签指定。

如果 Playlist 中的所有URI行都标识media segment,则 Playlist 是Media Playlist。 如果 Playlist 中的所有URI行都标识 Media Playlist ,则 Playlist 是 Master Playlist 。一个 Playlist 只可能会是 Media Playlist 或者 Master Playlist。其他类型 Playlist 是无效的。

Playlist中的 URI(无论是 URI 行还是标签的一部分)可能是相对的。 任何相对 URI 都被视为与包含它的 Playlist 的 URI 相关。

Media Playlist文件的持续时间是其中 Media Segment 的持续时间之和。

media segment的segment bit rate是media segment的大小除以其EXTINF持续时间(第4.3.2.1节)。 请注意,这包括容器开销,但不包括传递系统施加的开销,例如HTTP,TCP或IP标头。

Media Playlist 的峰值segment bit rate是任何连续的一组segment的最大比特率,其总持续时间在目标持续时间的0.5到1.5倍之间。 通过将segment大小的总和除以segment持续时间的总和来计算集合的比特率。

media segment的平均segment bit rate是Media Playlist 中每个media segment的大小(以bits为单位)之和除以Media Playlist 持续时间。 请注意,这包括容器开销,但不包括HTTP或传递系统强加的其他开销。

4.2 Attribute Lists

某些有值的标签是属性列表。 属性列表是以逗号分隔的属性/值对列表,没有空格。

属性/值对具有以下语法:

AttributeName=AttributeValue

AttributeName 是由[A..Z], [0..9] 和 '-' 组成的包含字符的不带引号的字符串。因此,AttributeNames仅包含大写字母,而不是小写字母。 =两边不得存在任何空格。

AttributeValue是以下之一:

  • 十进制:由[0..9] 集合组成的的不带引号字符串,表示十进制的整数,范围为 0 到 2^64-1 (1844674407370951615)。 十进制整数的字符串长度可能为 1 到 20 个字符。

  • 十六进制序列:由 [0..9] 和 [A..F] 集合组成的不带引号字符串。前缀为 0x 或 0X 。 十六进制序列的最大长度取决于其属性名称。

  • 十进制浮点:由[0..9] 和 ' . ' 组成的的不带引号字符串,在十进制表示法中表示非负浮点数。

  • 有符号十进制浮点:由[0..9] ,' - '和 ' . ' 组成的的不带引号字符串,在十进制表示法中表示有符号浮点数。

  • 引号字符串:一对双引号(0x22) 中的字符串。 以下字符不得出现在带引号的字符串中:换行符 (0xA)、回车符 (0xD) 或双引号 (0x22)。应该构造带引号的字符串AttributeValues,以便逐字节比较足以测试两个带引号的字符串AttributeValues是否相等。 请注意,这意味着区分大小写的比较。

  • 枚举字符串:来自集合的未加引号的字符串,由字符明确定义。 枚举字符串永远不会包含双引号 (""),逗号(,)或空格。

  • 十进制分辨率:由"x"字符分隔的两个小数整数。 第一个整数是水平像素尺寸(宽度);第二个是垂直像素尺寸(高度)。

给定AttributeNameAttributeValue的类型由属性定义指定。

给定AttributeName在给定属性列表中不能多次出现。 客户应拒绝播放此类Playlist。

4.3 Playlist Tags

Playlist 标签指定 Playlist 的全局参数,或有关其后显示的media segment 或media Playlist 的信息。

4.3.1 Basic Tags

这些标签在 Media Playlists 和 Master Playlists 中都允许。

4.3.1.1 EXTM3U

EXTM3U tag该文件是扩展 M3U Playlist 文件。 它必须在每个 Media Playlist 和每个 Master Playlist 的第一行。格式为:

#EXTM3U
4.3.1.2 EXT-X-VERSION

EXT-X-VERSION标签表明Playlist文件、其关联 Media 和其服务器的兼容性版本。

其作用于整个 Playlist 文件。格式为:

#EXT-X-VERSION:<n>

整数n为协议兼容版本号。

它必须出现在所有含有与协议版本1不兼容的标签或属性的 Playlists中,以支持与旧客户端的互操作性。第7部分指定了对于给定 Playlist 文件兼容的最小版本号。

一个 Playlist 文件 不能含有超过一个 EXT-X-VERSION标签。如果客户端遇到含有多个此标签的 Playlist ,必须拒绝。

4.3.2 Media Segment Tags

每个 Media Segment 由一系列 Media Segment 标签指定,后跟URI。 某些Media Segment 标签仅适用于下一个segment ;其他 Segment 应用于所有后续 segments ,直到同一标签的另一个实例(instance)。

Media Segment 标签不得出现在 Master Playlist 中。 客户端必须拒绝同时包含 Media Segment 标签和 Master Playlist 标签的 Playlists(第 4.3.4 节)。

4.3.2.1 EXTINF

EXTINF标签定义了Media Segment 的duration。其只应用于下一个 Media Segment。其对于每个Media Segment 是必须的。格式为:

 #EXTINF:<duration>,[<title>]

duration 是一个十进制浮点数或者十进制整数,以秒(s)为单位,表明了 Media Segment 的duration。一般而言, duration 应该是十进制浮点数,因其提供了足够的进度以避免时间累积造成的可察觉的错误。如果兼容版本号小于3,duration必须为整数。duration需要为整数的时候必须四舍五入到最近的整数。逗号之后的行的其余部分是 Media Segment 的可选的可读信息性标题,以原始 UTF-8 文本表示。

4.3.2.2 EXT-X-BYTERANGE

EXT-X-BYTERANGE标签 表明 Media Segment 是其 URI 标识的资源的子范围(sub-range)。

URI 行跟在其后。格式为:

#EXT-X-BYTERANGE:<n>[@<o>]

十进制整数n以 bytes为单位表示子范围的长度。如果出现,o是十进制整数,表示子范围的开始,作为从资源开头的字节偏移量。如果 o 不存在,则子范围从前一个 Media Segment 的子范围之后的下一个字节开始。

如果o不存在,则先前的 Media Segment 必须出现在 Playlist 文件中并且必须是相同media资源的子范围;或者 Media Segment 未定义且必须拒绝 Playlist。

没有 EXT-X-BYTERANGE 标签的 Media Segment 由其 URI 标识的整个资源组成。

该标签的使用要求兼容版本大于等于4 。

4.3.2.3 EXT-X-DISCONTINUITY

EXT-X-DISCONTINUITY标签表示其后面的 Media Segment 与之前的 Media Segment 之间的是不连续的。格式为:

#EXT-X-DISCONTINUITY

如果以下任一特征发生更改,则必须存在EXT-X-DISCONTINUITY标签:

  • 文件格式
  • tracks的 number , type , identifiers
  • 时间戳序号

如果以下任一特征发生更改,则应该存在EXT-X-DISCONTINUITY标签:

  • encoding parameters
  • encoding sequence

有关 EXT-X-DISCONTINUITY标签 的详细信息,请参阅第 3 节、第 6.2.1 节和第 6.3.3 节。

4.3.2.4 EXT-X-KEY

Media Segments 可能是加密的。EXT-X-KEY标签指定如何解密它们。 它适用于在 Playlist 文件中具有相同KEYFORMAT属性的介于其与下一个EXT-X-KEY标签之间(或 Playlist 文件末尾)的每个Media Segment。具有不同KEYFORMAT属性的两个或多个EXT-X-KEY标签如果最终产生相同的解密密钥,则可以应用于同一Media Segment。格式为:

#EXT-X-KEY:<attribute-list>

定义了以下属性:

METHOD

该值是指定加密方法的枚举字符串。 此属性为"必需"。

定义的方法为:NONE、AES-128 和 SAMPLE-AES。

NONE 的加密方法意味着 Media Segment 未加密。 如果加密方法为 NONE,则不得存在其他属性。

AES-128的加密方法表示使用高级加密标准AES_128(128位密钥,密码块链接和PKCS7填充)完全加密Media Segment 。 使用IV属性值或 Media Sequence Number 作为IV,在每个 segment 边界重新启动CBC; 见5.2节。

​ SAMPLE-AES 的加密方法意味着Media Segments 包含使用高级加密标准AES_128加密的 Media 样本,如音频或视频。这些 Media 流如何加密和封装在 Segment 中取决于介质编码和 Segment 的 Media 格式。fMP4 Media Segment 使用通用加密的cbcs方案 COMMON_ENC进行加密。HLS 示例加密 [sampleEnc] 规范中介绍了包含 H.264 H_264、AAC ISO_14496、AC-3 AC_3 和enchanted AC-3 AC_3 Media Segment 的加密。IV 属性可能存在;参见第 5.2 节。

URI

该值是包含指定如何获取密钥的 URI 的引号字符串。 此属性为"必需",除非METHOD为无。

IV

该值是十六进制序列,指定要与密钥一起使用的128位无符号整数初始化向量。

使用IV属性需要兼容版本号>=2。 有关何时使用IV属性,请参见第5.2节。

KEYFORMAT

该值是带引号的字符串,用于指定密钥在URI标识的资源中的表示方式;有关详细信息,请参见第5节。 这个属性是可选的;

its absence indicates an implicit value of "identity". 使用 KEYFORMAT 属性需要兼容性版本号为 5 或更高版本。

KEYFORMATVERSIONS

该值是一个带引号的字符串,包含一个或多个由“/”字符分隔的正整数(例如,“1”,“1/2”或“1/2/5”)。如果定义了特定KEYFORMAT的多个版本,则此属性可用于指示此实例符合哪个版本。这个属性是可选的; 如果它不存在,则其值被认为是“1”。 使用KEYFORMATVERSIONS属性需要兼容版本号为5或更高版本。

如果 Media Playlist文件不包含EXT-X-KEY标签,则 Media Segment 不会加密。

有关密钥文件格式的信息,请参阅第5节;有关 Media Segment 加密的其他信息,请参见第5.2节,第6.2.3节和第6.3.6节。

4.3.2.5 EXT-X-MAP

EXT-X-MAP 标签指定如何获取分析适用的 Media Segments 所需的 Media Initialization Section (第 3 节)。它适用于 Playlist 中出现后的每个 Media Segment ,直到下一个 EXT-X-MAP 标签或 playlist 结束。格式为:

#EXT-X-MAP:<attribute-list>

定义了以下属性:

URI

该值是带引号的字符串,该URI包含标识包含 Media Initialization Section 的资源的URI。 此属性是必需的。

BYTERANGE

该值是一个带引号的字符串,用于指定URI属性标识的资源的字节范围。该范围应该只包含 Media Initialization Section。第4.3.2.2节描述了字节范围的格式。该属性是可选的。如果不存在,则字节范围是URI指示的整个资源。

当 Playlist 中的第一个 Media Segment(即I帧)(或EXT-X-DISCONTINUITY标签后面的第一个 segment)没有立即跟随其资源开头的 Media Initialization Section 时,应该为Playlist中带有EXT-XI-FRAMES-ONLY标签的Media Segments提供EXT-X-MAP标签。

在包含EXT-X-I-FRAMES-ONLY标签的 Media Playlist 中使用EXT-X-MAP标签需要兼容版本号为5或更高版本。

在不包含EXT-X-I-FRAMES-ONLY标签的 Media Playlist 中使用EXT-X-MAP标签需要兼容版本号为6或更高版本。

4.3.2.6. EXT-X-PROGRAM-DATE-TIME

EXT-X-PROGRAM-DATE-TIME 标签将 Media Segment 的第一个 sample 与绝对日期和/或时间相关联。 它仅应用于下一个Media Segment。

日期/时间表示为ISO / IEC 8601:2004 ISO_8601,并且应该指示时区和秒的小数部分:

#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ss.SSSZ>

For example:

#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00

EXT-X-PROGRAM-DATE-TIME标签应该提供毫秒精度。

有关EXT-X -PROGRAM-DATE-TIME标签的更多信息,请参见第6.2.1节和第6.3.3节。

4.3.2.7. EXT-X-DATERANGE

EXT-X-DATERANGE标签将日期范围(即由开始日期和结束日期定义的时间范围)与一组属性/值对相关联。格式为:

#EXT-X-DATERANGE:<attribute-list>

其中定义的属性是:

ID

带引号的字符串,用于唯一标识 Playlist 中的日期范围。 此属性是必需的。

CLASS

客户端定义的引用字符串,它指定一组属性及其关联的值语义。 具有相同CLASS属性值的所有日期范围必须遵守这些属性值语义。 此属性是可选的。

START-DATE

带引号的字符串,包含日期范围开始的ISO-8601日期。 此属性是必需的。

END-DATE

带引号的字符串,包含日期范围结束的ISO-8601日期。 它必须等于或晚于START-DATE属性的值。 此属性是可选的。

DURATION

日期范围的持续时间表示为十进制浮点数秒。 它绝不是复数。 单个时间瞬间(例如,跨越终点线)应以 0 的持续时间表示。 此属性是可选的。

PLANNED-DURATION

日期范围的预期持续时间表示为十进制浮点数秒。它绝不是复数。 该属性应该用于指示实际持续时间尚未知晓的日期范围的预期持续时间。 这是可选的。

X-

“X-”前缀定义为客户端定义的属性保留的名称空间。 client-attribute必须是合法的AttributeName

客户端在定义自己的属性名称时应该使用反向DNS语法以避免冲突。属性值必须是带引号的字符串,十六进制序列或十进制浮点数。 客户定义属性的示例是X-COM-EXAMPLE-AD-ID =“XYZ123”。 这些属性是可选的。SCTE35-CMD, SCTE35-OUT, SCTE35-IN 用于携带SCTE-35数据。有关更多信息,请参见第4.3.2.7.1节。 这些属性是可选的。

END-ON-NEXT

枚举字符串,其值必须为YES。 此属性指示包含它的范围的结尾等于下一个范围的START-DATE。随后的范围(the following range)是相同CLASS中当前range的START-DATE之后最早的START-DATE的Date range。

带有END-ON-NEXT=YES属性的EXT-X-DATERANGE标签必须具有CLASS属性。 具有相同CLASS属性的其他EXT-X-DATERANGE标签不得指定重叠的日期范围。

带有END-ON-NEXT=YES属性的EXT-X-DATERANGE标签不得包含DURATION或END-DATE属性。

没有DURATIONEND-DATEEND-ON-NEXT=YES属性的日期范围具有未知的持续时间,即使它具有PLANNED-DURATION

如果Playlist包含EXT-X-DATERANGE标签,则它还必须包含至少一个EXT-X-PROGRAM-DATE-TIME标签。

如果Playlist包含两个具有相同ID属性值的EXT-X-DATERANGE标签,则两个标签中出现的任何AttributeName必须具有相同的AttributeValue

如果日期范围同时包含DURATION属性和END-DATE属性,则END-DATE属性的值必须等于START-DATE属性的值加上DURATION属性的值。

客户端应该忽略非法语法的EXT-X-DATERANGE标签。

4.3.2.7.1. Mapping SCTE-35 into EXT-X-DATERANGE

根据SCTE-35规范SCTE35在源 Media 中携带的拼接信息可以使用EXT-X-DATERANGE标签在 Media Playlist中表示。

每个包含splice_null(),splice_schedule(),bandwidth_reservation()或private_cmd()的SCTE-35 splice_info_section()应该由具有SCTE35-CMD属性的EXT-X-DATERANGE标签表示,该属性的值是大端二进制表示 splice_info_section()的表达式,表示为十六进制序列。

More Detail Ref: https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.7.1

4.3.3. Media Playlist Tags

Media Playlist 标签描述 Media Playlist 的全局参数。 任何 Media Playlist 中每种类型的 Media Playlist 标签不得超过一个。

Media Playlist 标签不得出现在 Master Playlist 中。

4.3.3.1. EXT-X-TARGETDURATION

EXT-X-TARGETDURATION标签指定Media Segment 的最大持续时间。 Playlist文件中每个 Media Segment 的EXTINF持续时间,舍入到最接近的整数时,必须小于或等于目标持续时间; 较长的 Segment 可以触发播放停顿或其他错误。 它适用于整个Playlist文件。格式为:

#EXT-X-TARGETDURATION:<s>

其中s是十进制整数,表示以秒为单位的目标持续时间。 EXT-X-TARGETDURATION标签是必需的。

4.3.3.2. EXT-X-MEDIA-SEQUENCE

EXT-X-MEDIA-SEQUENCE标签指示出现在 Playlist 文件中的第一个 Media Segment 的 Media 序列号。格式为:

#EXT-X-MEDIA-SEQUENCE:<number>

number 是十进制整数。

如果 Media Playlist 文件不包含EXT-X-MEDIA-SEQUENCE标签,则 Media Playlist 中第一个 Media Segment 的 Media 序列号应被视为0。客户端不得假定不同 Media Playlist 中具有相同 Media 序列号的片 Segment 包含匹配的内容 - 请参阅第6.3.2节。

Media Segment 的URI不需要包含其 Media 序列号。有关设置EXT-X-MEDIA-SEQUENCE标签的更多信息,请参见第6.2.1节和第6.3.5节。

EXT-X-MEDIA-SEQUENCE标签必须出现在 Playlist 中的第一个 Media Segment 之前。

4.3.3.3. EXT-X-DISCONTINUITY-SEQUENCE

EXT-X-DISCONTINUITY-SEQUENCE标签允许同一Variant Stream的不同Renditions或其 Media Playlist 中具有EXT-X-DISCONTINUITY标签的不同Variant Streams之间的同步。格式为:

#EXT-X-DISCONTINUITY-SEQUENCE:<number>

number 是十进制整数。

如果 Media Playlist 不包含EXT-X-DISCONTINUITY-SEQUENCE标签,则 Playlist 中第一个 Media Segment 的不连续序列号应视为0。

EXT-X-DISCONTINUITY-SEQUENCE标签必须出现在 Playlist 中的第一个 Media Segment 之前。

EXT-X-DISCONTINUITY-SEQUENCE标签必须出现在任何EXT-X-DISCONTINUITY标签之前。

有关设置EXT-X-DISCONTINUITY-SEQUENCE标签值的更多信息,请参见第6.2.1节和第6.2.2节。

4.3.3.4. EXT-X-ENDLIST

EXT-X-ENDLIST标签表示不再向 Media Playlist 文件添加 Media Segment 。 它可能出现在 Media Playlist 文件中的任何位置。格式为:

#EXT-X-ENDLIST
4.3.3.5. EXT-X-PLAYLIST-TYPE

EXT-X-PLAYLIST-TYPE标签提供有关 Media Playlist 文件的可变性信息。 它适用于整个 Media Playlist 文件。 这是可选的。格式为:

#EXT-X-PLAYLIST-TYPE:<EVENT|VOD>

第6.2.1节定义了EXT-X-PLAYLIST-TYPE标签的含义。

如果EXT-X-PLAYLIST-TYPE值为EVENT,则 Media Segment 只能添加到 Media Playlist 的末尾。 如果EXT-X-PLAYLIST-TYPE值为VOD,则 Media Playlist 无法更改。

如果 Media Playlist 中省略了EXT-X-PLAYLIST-TYPE标签,则可以根据第6.2.1节中的规则更新 Playlist ,不附加任何限制。 例如,可以更新实时 Playlist (第6.2.2节)以按照它们出现的顺序删除 Media Segment 。

4.3.3.6. EXT-X-I-FRAMES-ONLY

EXT-X-I-FRAMES-ONLY标签表示 Playlist 中的每个 Media Segment 描述单个I帧。 I帧(或帧内帧)是编码的视频帧,其编码不依赖于任何其他帧。 I帧 Playlist 可用于 trick play ,例如快进,快速反向和 scrubbing。EXT-X-I-FRAMES-ONLY标签适用于整个 Playlist 。格式为:

#EXT-X-I-FRAMES-ONLY

在带有EXT-X-I-FRAMES-ONLY标签的 Playlist 中, Media Segment 持续时间(EXTINF标签值)是 Media Segment 中I帧的呈现时间与 Playlist 中下一个I帧的呈现时间之间的时间;或者如果它是 Playlist 中的最后一个I帧,则是presentation的结束。

包含I帧 Segment 的 Media 资源必须以 Media Initialization Section(第3节)开头,或者伴有指示 Media Initialization Section 的EXT-X-MAP标签,以便客户端可以按任何顺序加载和解码I帧 Segment 。应用了EXT-X-BYTERANGE标签的I帧 Segment 的字节范围(第4.3.2.2节)不得包括其 Media Initialization Section。客户端可以假设Media Initialization Section由EXT-X-MAP标签定义,或者位于资源的起始位置到该资源中第一个I帧的偏移量。

使用EXT-X-I-FRAMES只需要兼容版本号为4或更高版本。

4.3.4. Master Playlist Tags

Main Playlist 标签定义 presentation 的Variant Streams,Renditions和其他全局参数。

Main Playlist 标签不得出现在 Media Playlist 中; 客户必须拒绝任何包含 Main Playlist 标签和 Media Playlist 标签或 Media Segment 标签的 Playlist 。

4.3.4.1. EXT-X-MEDIA

EXT-X-MEDIA标签用于关联包含相同内容的替代Renditions(第4.3.4.2.1节)的 Media Playlist 。例如,可以使用三个EXT-X-MEDIA标签来识别包含相同 presentation 的英语,法语和西班牙语演绎的纯音频 Media Playlist 。 或者,可以使用两个EXT-X-MEDIA标签来识别显示两个不同摄像机角度的仅视频 Media Playlist 。

格式为:

#EXT-X-MEDIA:<attribute-list>

定义了以下属性:

TYPE

该值是枚举字符串; 有效字符串是AUDIO,VIDEO,SUBTITLES和CLOSED-CAPTIONS。 此属性是必需的。

在传输流中,隐藏字幕(CLOSED-CAPTIONS) CEA608 Media 在视频流中携带。因此,TYPE为CLOSED-CAPTION的EXT-X-MEDIA标签不指定 Rendition。隐藏字幕的media 以每一个 video Rendition的 Media Segments 来呈现。

URI

该值是带引号的字符串,其中包含标识 Media Playlist 文件的URI。 此属性是可选的;参考第4.3.4.2.1节。 如果TYPE是CLOSED-CAPTIONS,则URI属性不得出现。

GROUP-ID

该值是带引号的字符串,用于指定Rendition所属的组。 见4.3.4.1.1节。 此属性是必需的。

LANGUAGE

该值是一个带引号的字符串,其中包含一个标识语言标签RFC5646,用于标识Rendition中使用的主要语言。 此属性是可选的。

ASSOC-LANGUAGE

该值是带引号的字符串,其中包含语言标签[RFC5646],用于标识与Rendition关联的语言。
关联语言通常用于与LANGUAGE属性指定的语言不同的角色(例如,书面与口语,或作为后备方言)。 此属性是可选的。

例如,LANGUAGEASSOC-LANGUAGE属性可用于链接使用不同语言和书面语言的挪威语 renditions。

NAME

该值是带引号的字符串,其中包含可读的Rendition描述。 如果存在LANGUAGE属性,则此描述应该使用该语言。 此属性是必需的。

DEFAULT

该值是枚举字符串; 有效字符串是YES和NO。 如果值为YES,那么客户端应该在没有来自用户的指示不同选择的信息的情况下播放该内容的Rendition。 此属性是可选的。缺失该标签意味着NO。

AUTOSELECT

该值是枚举字符串; 有效字符串是YES和NO。 此属性是可选的。 缺失表明NO。 如果值为YES,则客户端可以选择在没有明确用户首选项的情况下播放此Rendition,因为它与当前播放环境(例如所选系统语言)匹配。

如果存在AUTOSELECT属性,则如果DEFAULT属性的值为YES,则其值必须为YES。

FORCED

该值是枚举字符串; 有效字符串是YES和NO。
此属性是可选的。 缺失表明NO。 除非TYPE是SUBTITLES,否则FORCED属性不能出现。

值为YES表示Rendition包含被认为必不可少的内容。 选择FORCED Rendition时,客户端应该选择与当前播放环境(例如语言)最匹配的那个。

值NO表示Rendition包含旨在响应显式用户请求而播放的内容。

INSTREAM-ID

该值是带引号的字符串,用于指定 Media Playlist 中各 Segment 内的 Rendition。 如果TYPE属性为CLOSED-CAPTIONS,则此属性为必需的,在这种情况下,它必须具有以下值之一:“CC1”,“CC2”,“CC3”,“CC4”或“SERVICEn”,其中n必须是整数 介于1和63之间(例如“SERVICE3”或“SERVICE42”)。

值“CC1”,“CC2”,“CC3”和“CC4”标识第21行Data Services channel [CEA608]。 “SERVICE”值表示Digital Television Closed Captioning[CEA708]服务块号。

对于所有其他TYPE值,不得指定INSTREAM-ID。

CHARACTERISTICS

该值是带引号的字符串,其中包含由逗号(,)字符分隔的一个或多个统一类型标识符[UTI]。属性可选。每个UTI表示Rendition的个体特征。

SUBTITLES Rendition可能包含以下特征:

"public.accessibility.transcribes-spoken-dialog";
"public.accessibility.describes-music-and-sound";
"public.easy-to-read" (which indicates that the subtitles have been edited for
ease of reading).

音频Rendition可包括以下特征:

"public.accessibility.describes-video"

CHARACTERISTICS属性可以包含私有UTI。

CHANNELS

该值是带引号的字符串,用于指定有序的“/” - 分隔的参数列表。如果TYPE属性是AUDIO,则第一个参数是表示为十进制整数的音频通道计数,表示Rendition中任何 Media Segment 中存在的独立同步音频通道的最大数量。例如,AC-3 5.1 rendition 将具有CHANNELS =“6”的属性。 目前没有定义其他CHANNELS参数。

所有音频EXT-X-MEDIA标签都应该有CHANNELS属性。 如果 Main Playlist 包含两个 Rendition,使用相同编解码器编码但具有不同数量的通道,则CHANNELS属性是必需的; 否则它是可选的。

4.3.4.1.1. Rendition Groups

一组具有相同GROUP-ID值和相同TYPE值的一个或多个EXT-X-MEDIA标签定义了一组 Renditions。 该小组的每个成员必须是相同内容的 alternative rendition ; 否则可能会发生播放错误。

Playlist 中的所有EXT-X-MEDIA标签必须满足以下约束:

  • 同一组中的所有EXT-X-MEDIA标签必须具有不同的NAME属性。
  • 一个组不得有多个DEFAULT属性为YES的成员。
  • 具有AUTOSELECT=YES属性的每个EXT-X-MEDIA标签应该具有LANGUAGE [RFC5646],ASSOC-LANGUAGE,FORCED和CHARACTERISTICS属性的组合,这些属性与其Group的其他AUTOSELECT=YES成员的属性不同。

Playlist 可以包含多个相同TYPE的组,以便提供该 Media 类型的多种编码。 如果它这样做,则相同TYPE的每个组必须具有相同的成员集,并且每个相应的成员必须具有相同的属性,但URI和CHANNELS属性除外。

一组 Rendition 中的每个成员可以具有不同的 sample 格式。例如,英语演绎可以用AC-3 5.1编码,而西班牙语演绎用AAC立体声编码。但是,关于此类组的任何EXT-X-STREAM-INF(第4.3.4.2节)标签或EXT-XI-FRAME-STREAM-INF(第4.3.4.3节)标签必须具有CODECS属性,该属性列出了在组中 Renditions 的每一个sample 格式,或者可能发生的客户端播放失败。在上面的示例中,CODECS属性将包括“ac-3,mp4a.40.2”。

4.3.4.2. EXT-X-STREAM-INF

EXT-X-STREAM-INF标签指定Variant Stream,它是一组Renditions,可以组合起来播放presentation。 标签的属性提供有关Variant Stream的信息。

EXT-X-STREAM-INF标签之后的URI行指定携带 Variant Stream 的 Renditions 的 Media Playlist 。 URI行是必需的。Clients that do not support multiple video renditions SHOULD play this Rendition。 格式为:

#EXT-X-STREAM-INF:<attribute-list>
<URI>

定义了如下属性:

BANDWIDTH

该值是每秒位数的十进制整数。 它表示 Variant Stream 的峰值 Segment 比特率。

如果已经创建了 Variant Stream 中的所有 Media Segment ,则BANDWIDTH值必须是由任何可播放的Renditions组合产生的峰值 Segment 比特率总和的最大值。(对于具有单个 Media Playlist 的 Variant Stream ,这只是该 Media Playlist 的峰值 Segment 比特率。)

不准确的值可能导致播放停顿或阻止客户端播放。

如果要在 presentation 中的所有 Media Segments 编码之前使 Main Playlist可用,则BANDWIDTH值应该是使用相同设置编码的类似内容的代表性时 Segment 的BANDWIDTH值。

每个EXT-X-STREAM-INF标签必须包含BANDWIDTH属性。

AVERAGE-BANDWIDTH

该值是每秒位数的十进制整数。 它表示 Variant Stream 的平均 Segment 比特率。

如果已经创建了 Variant Stream 中的所有 Media Segment ,则AVERAGE-BANDWIDTH值必须是由任何可播放的Rendition组合产生的平均 Segment 比特率总和的最大值。(对于具有单个 Media Media Playlist 的 Variant Stream ,这只是该 Media Media Playlist 的平均分 Segment 比特率。)

不准确的值可能导致播放停顿或阻止客户端播放。

如果要在 presentation 中的所有 Media Segment 编码之前使 Main Playlist 可用,则AVERAGE-BANDWIDTH值应该是使用相同设置编码的类似内容的代表性时 Segment 的AVERAGE-BANDWIDTH值。

AVERAGE-BANDWIDTH属性是可选的。

CODECS

该值是带引号的字符串,其中包含以逗号分隔的格式列表,其中每种格式指定由Variant Stream指定的一个或多个Renditions中存在的 Media sample类型。有效格式标识符是在ISO基础 Media 文件格式名称空间由“编解码器”和“配置文件”参数定义的那些“Bucket” Media 类型[ RFC6831 ]。例如,包含AAC-LC音频和H.264 Main Profile Level 3.0视频的流的CODECS值为“mp4a.40.2,avc1.4d401e”。

每个EXT-X-STREAM-INF标签应该包含CODECS属性。

RESOLUTION

该值是十进制分辨率,用于描述在 Variant Stream 中显示所有视频的最佳像素分辨率。

RESOLUTION属性是可选的,但如果Variant Stream包含视频,则建议使用此属性。

FRAME-RATE

该值是一个十进制浮点,用于描述 Variant Stream 中所有视频的最大帧速率,四舍五入到小数点后3位。

FRAME-RATE属性是可选的,但如果Variant Stream包含视频,则建议使用此属性。 如果Variant Stream中的任何视频超过每秒30帧,则应该包括FRAME-RATE属性。

HDCP-LEVEL

该值是枚举字符串; 有效字符串是TYPE-0和NONE。 这个属性是建议性的; 值TYPE-0表示Variant Stream可能无法播放,除非输出受HDCP Type 0 [HDCP]或同等保护。值NONE表示内容不需要输出复制保护。

具有不同HDCP级别的加密 Variant Stream 应该使用不同的 Media 加密密钥。

HDCP-LEVEL属性是可选的。 如果没有HDCP,Variant Stream中的任何内容将无法播放,它应该存在。 没有输出复制保护的客户端不应该加载具有HDCP-LEVEL属性的Variant Stream,除非它的值为NONE。

AUDIO

该值是带引号的字符串。它必须与 Main Playlist 中类型属性为 AUDIO 的 EXT-X-MEDIA 标签的 GROUP-ID 属性的值匹配 它表示播放 presentation 时应该使用的音频 Rendition 集。 见4.3.4.2.1节。

AUDIO属性是可选的。

VIDEO

该值是带引号的字符串。它必须与 Main Playlist 中类型属性为 VIDEO 的 EXT-X-MEDIA 标签的 GROUP-ID 属性的值匹配 它表示播放 presentation 时应该使用的视频 Rendition 集。 见4.3.4.2.1节。

VIDEO 属性是可选的。

SUBTITLES

该值是带引号的字符串。它必须与 Main Playlist 中类型属性为 SUBTITLES的 EXT-X-MEDIA 标签的 GROUP-ID 属性的值匹配 它表示播放 presentation 时应该使用的subtitle Rendition 集。 见4.3.4.2.1节。

SUBTITLES 属性是可选的。

CLOSED-CAPTIONS

该值可以是带引号的字符串,也可以是值为NONE的枚举字符串。 如果该值是带引号的字符串,则它必须匹配其TYPE属性为CLOSED-CAPTIONS的 Media Playlist 中其他位置的EXT-X-MEDIA标签的GROUP-ID属性的值,并指示一组 closed-caption Renditions 可以在播放 presentation 时使用。

如果该值是枚举字符串值NONE,则所有EXT-X-STREAM-INF标签必须具有值为NONE的此属性,表示 Main Playlist 中的任何Variant Stream中没有隐藏字幕(closed captions)。 在一个Variant Stream中有隐藏字幕而另一个没有可能会触发播放不一致。

CLOSED-CAPTIONS 属性是可选的。

4.3.4.2.1. Alternative Renditions

EXT-X-STREAM-INF标签包含AUDIO,VIDEO,SUBTITLES或CLOSED-CAPTIONS属性时,它表示内容的备用Renditions可用于播放该Variant Stream。

定义备用Renditions时,必须满足以下约束以防止客户端 playback 错误:

  • EXT-X-STREAM-INF标签关联的所有可播放组合必须具有小于或等于EXT-X-STREAM-INF标签的BANDWIDTH属性的聚合带宽
  • 如果EXT-X-STREAM-INF标签包含RESOLUTION属性和VIDEO属性,则每个替代视频Rendition必须具有与RESOLUTION属性的值匹配的最佳显示分辨率。
  • EXT-X-STREAM-INF标签相关的每个替代Rendition必须满足6.2.4节中描述的Variant Stream的约束。

如果媒体类型是SUBTITLES,则EXT-X-MEDIA标签的URI属性是必需的,但如果媒体类型是VIDEO或AUDIO,则是可选的。

如果媒体类型为视频或音频,则缺少 URI 属性表示此 Rendition 的媒体数据包含在引用此 EXT-X-MEDIA 标签的任何 EXT-X-STREAM-INF 标签的Media Playlist中

如果媒体类型为 AUDIO,并且缺少 URI 属性,则客户端必须假定此Rendition 的音频数据存在于 EXT-X-STREAM-INF 标签指定的每个视频格式Rendition 中。

如果媒体类型为CLOSED-CAPTIONS,则不得包含EXT-X-MEDIA标签的URI属性。

4.3.4.3. EXT-X-I-FRAME-STREAM-INF

EXT-X-I-FRAME-STREAM-INF标签标识包含 multimedia presentation 的I帧的 Media Playlist 文件。 它是独立的,因为它不适用于Master Playlist 中的特定URI。格式为:

#EXT-X-I-FRAME-STREAM-INF:<attribute-list>

EXT-X-STREAM-INF标签定义的所有属性(第4.3.4.2节)也是为EXT-X-I-FRAME-STREAM-INF标签定义的,但FRAME-RATE,AUDIO,SUBTITLES和CLOSED-CAPTIONS属性除外。

此外,还定义了以下属性:

HLS manifest standard 翻译: HTTP Live Streaming draft-pantos-http-live-streaming-23的更多相关文章

  1. Nginx基础知识之————RTMP模块中的中HLS专题(翻译文档)

    一.在Nginx配置文件的RTMP模块中配置hls hls_key_path /tmp/hlskeys; 提示错误信息: nginx: [emerg] the same path name " ...

  2. 1.Spark Streaming另类实验与 Spark Streaming本质解析

    1 Spark源码定制选择从Spark Streaming入手  我们从第一课就选择Spark子框架中的SparkStreaming. 那么,我们为什么要选择从SparkStreaming入手开始我们 ...

  3. Spark Streaming概念学习系列之Spark Streaming容错

    Spark Streaming容错 检查点机制-checkpoint 什么是检查点机制? Spark Streaming 周期性地把应用数据存储到诸如HDFS 或Amazon S3 这样的可靠存储系统 ...

  4. Spark Streaming概念学习系列之Spark Streaming的竞争对手

    不多说,直接上干货! Spark Streaming的竞争对手 Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology).这个拓扑将会被提交给集群,由集群中的 ...

  5. 《Streaming Systems》第一章: Streaming 101

    数据的价值在其产生之后,将随着时间的流逝逐渐降低.因此,为了获得最大化的数据价值,尽可能实时.快速地处理新产生的数据就显得尤为重要.实时数据处理将在越来越多的场景中体现出更大的价值所在 -- 实时即未 ...

  6. HLS(HTTP Live Streaming)学习和探讨

    Introduction HTTP Live Streaming lets you send audio and video over HTTP from an ordinary web server ...

  7. Spark2.0机器学习系列之9: 聚类(k-means,Bisecting k-means,Streaming k-means)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  8. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  9. Spark Streaming+Kafka

    Spark Streaming+Kafka 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端, ...

随机推荐

  1. SQLAlchemy如何筛选值为None的列?那么django呢

    示例 from sqlalchemy import create_engine, MetaData, and_, or_, TIMESTAMP Plugin.query.filter(and_(Plu ...

  2. [System.Serializable],

    [System.Serializable]添加在类,枚举,结构前面,可以让该这些对象在inspector中显示 [SerializeField]是设置非public 成员对象在inspector中显示

  3. mongodb中对数组的操作命令

    mongodb中对数组的操作命令有$push.$ne.$addtoset.$pop.$pull ###addtoset会碰到的问题addtoset解释: 往数组里面加入数据,如果数组里已经存在,则不会 ...

  4. Docker Java程序镜像制作

    Docker Java程序镜像制作 制作前的准备 jre:不需要完整的jdk,jre即可,到Oracle进行下载即可,下载链接,根据自己的情况进行选择,这里选择jre-8u221-linux-x64. ...

  5. 【ABAP系列】SAP ABAP BAPI_REQUISITION_CREATE创建采购申请

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP BAPI_RE ...

  6. 【编程开发】CMake相关注意事项

    [编程开发]CMake相关注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ CMake是一个非常常用的跨平台移植的工具,CMake可用来生成不同平台下 ...

  7. 机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总

    <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...

  8. mongodb 连接后无法使用 发现已经有进程在运行

    mongod 命令执行发现已经有进程在运行mongod数据库--errno:48 Address already in use for socket: 0.0.0.0:27017 错误信息: list ...

  9. python的u,r,b分别什么意思?

      我们经常在python当中看到以下内容: print(u'hi\thi\thi') print(b'hi\thi\thi') print(r'hi\thi\thi') 在其他语言里没见过类似的,所 ...

  10. [转帖]海思大佬称华为CPU同频追平AMD 注水吹嘘玩文字游戏?

    海思大佬称华为CPU同频追平AMD 注水吹嘘玩文字游戏? https://t.cj.sina.com.cn/articles/view/6635931736/18b88485800100cz4h?fr ...