1. 引言
本文档主要描述了“如何传输无边界多媒体数据流的”的协议的规范和实现细节。该协议支持加密媒体流和统一流得多版本自适应(多码流自适应)。在该协议下,媒体数据在生成之后会立即进行传输,进而保证其具有接近实时播放的效果。数据的传输建立在HTTP协议的基础之上。
其他相关参考文档将在第11节中给出。
2. 总结
任意多媒体流将由只想某播放列表文件的URI表示,该文件由一个排序的媒体URI列表和信息标签组成。每个媒体URI只想一个连续的流的文件切片。
在播放过程中,客户端首先获取播放列表文件,进而获取播放列表中描述的文件片并播放它。客户端会不断地重新加载播放列表文件。
本文档中部分关键词的描述可参考RFC 2119。
3. 播放列表文件
3.1 引言
播放列表文件是扩展M3U播放列表。本文档通过定义额外的标签扩展了M3U文件格式。
一个M3U播放列表文件包含多个独立的行。每一行由一个LF标记结尾或由一个CR+LF标记结尾。每行的内容可以是一个URI,空行或者是以”#”开头的注释。空白行将被忽略。空格符将不会被展示出来,除非某元素明确的制定它。
一个URI行指定了一个媒体文件或者另外一个播放列表。(参阅3.3.8节)
URIs地址可以使相对地址。该相对路径的定位地址必须与播放列表文件所在目录一致。
由”#”开头的行可以是注释或者标签。一般标签以”#EXT”开头,其余的行均被视为注释。
播放列表的总时长应该是其所包含媒体文件的时长之和。
M3U文件中,以.m3u8结尾,或其http头中”Content-Type”字段为” application/vnd.apple.mpegurl”会以UTF-8编码,而以”m3u” 或其http对应字段为” "audio/mpegurl”会以US-ASCII编码。播放列表文件必须以上面某一匹配对对应。
扩展的M3U文件格式定义了两个标签:EXTM3U和EXTINF。扩展的M3U文件通过在第一行中加入” #EXTM3U” 与基本的M3U文件进行区分。
3.2 属性列表
某些扩展的M3U标签的值是一个由逗号作为分隔符的属性列表,属性列表中不应出现空格。其语法如:
AttributeName=AttributeValue
其中属性名不需要被引号包含,它是一个有字符[A –Z ] 和‘-‘组成的字符串。而属性值得取值范围如下:
l 十进制整型数:由[ 0 –9 ]组合成的10进制整数。
l 十六进制整数:[ 0 –9 ] 和 [A –F],以0x或0X开头
l 十进制浮点数:[ 0 –9 ] 和‘ . ‘
l 字符串:引号包含,不可使用linefeed(0xA,换行) carriage-return(0xD, 回车) 和双引号(0x22)。需要使用这些特殊符号时,需要转义。
l 枚举字符串:由属性定义的一个取值集合,表现形式为一个无引号字符串,其值不能包括双引号、逗号和空格。
l 十进制表示的分辨率: 宽度X高度,单位为像素
属性值得类型由给定的属性定义。在一个属性列表中,属性名应该仅出现一次。客户端在实现的过程中,需要忽略无法识别的属性名/属性值对。尤其对于枚举类型,若其属性名可识别,但其属性值不可识别,则也需要忽略。
3.3 标准标签
3.3.1 EXTM3U
扩展的M3U文件与基本的M3U的区别在第一行,其值必须为标签 #EXTM3U。这个标签在媒体播放列表和主播放列表中均应该被包含。形式如下:
#EXTM3U
3.3.2 EXTINF
该标签指定媒体文件片的时长。其作用范围仅限于它后面的媒体文件片,其后必须为一个媒体文件片的资源地址(URI)。每个文件片均需前置一个EXTINF。形式如下:
#EXTINF:
Duration的取值可以是:十进制整型或十进制浮点数,采用近似取整。若协议版本低于3,则该值必须为整数。协议版本不小于3时,其值使用浮点数表示。
Title部分用于对其后文件片添加一些可读的描述信息。
3.4 新标签
本节中我们将展示本文档中新定义的标签。
3.4.1 EXT-X-BYTERANGE
本标签标明文件片为URI对应文件资源的一个子集。其仅作用于其后的下一个媒体文件URI 。形式如下:
#EXT-X-BYTERANGE:
其中n为整数,表示子集的字节数。o为可选项,标明子集的起始位置,相当于从资源开始出计算的偏移量。若o未定义,则其开始位置为上一个子集的结束位置下一个字节。
当o未定义的时候,其上一个文件资源必须是同一文件的子集,且其不能为文件列表中的第一个文件片。
本标签出现在4以上版本,且不应出现在主播放列表中。
3.4.2 EXT-X-TARGETDURATION
本标签的值应大于等于文件列表中最大文件片的时长,其只在媒体播放列表中出现一次,作用域为整个媒体文件列表,它不可出现在主播放列表中,形式如下:
#EXT-X-TARGETDURATION:
3.4.3 EXT-X-MEDIA-SEQUENCE
播放列表中的每个文件片均由唯一的一个整型序列号,其值顺序加1递增。本标签的值为当前播放列表中第一个文件片的序列号。形式如下:
#EXT-X-MEDIA-SEQUENCE:
本标签需出现在第一个文件片之前,且不能出现在主播放列表中。当媒体播放列表不包含改标签时,其首个文件片的序列号被视为0 。
文件资源定位符中可不出现序列号。
3.4.4 EXT-X-KEY
媒体文件片可能被加密,而本标签表明如何对其进行解密。它作用于其后所有的文件片,直到下一个同名标签(with the same KEYFORMAT)的出现。两个以上的EXT-X-KEY可能会将不同的KEYFORMAT属性作用于同一文件片,它们必须被解析为相同的key。
#EXT-X-KEY:
以下是一些属性:
METHOD : 枚举值,标明加密方法,必须。
u NONE ,未加密,当METHOD取值为NONE时,以下属性不得出现 URI、IV、KEYFORMAT、KEYFORMATVERSION
u AES-128,使用128位密钥和PKCS7补齐的AES算法。该取值下,URI属性必须出现,IV属性可选。
u SAMPLE-AES ,标明文件片中包含使用AES-128加密的媒体取样,如audio或video,这些取样的加密和封装方式与媒体文件的编码和文件片类型有关。
客户端遇到无法识别的METHOD,放弃解密。
URI : 引号包含的字符串,其URI指明获取密钥的地址,出METHOD取值为NONE时,该属性为必须。
Iv: 十六进制整数,指明密钥使用的初始向量。
KEYFORMAT: 引号包含的字符串,指明密钥在URI中的表现形式。该属性可选,当该属性不出现时,其具有一个默认值”identity”。
KEYFORMATVERSION:引号包含的字符串,其内容为斜杠分隔的整数,如”1/3”,当有多个KEYFORMAT时,指明实例的版本,不出现表示值为1 。
3.4.5 EXT-X-PROGRAM-DATE-TIME
标明其后一个文件片第一个取样的日期和事件,形式如下:
#EXT-X-PROGRAM-DATE-TIME:
示例:#EXT-X-PROGRAM-DATE-TIME:2010-02-19T14:54:23.031+08:00
3.4.6 EXT-X-ALLOW-CACHE
作用于全局文件片,表明客户端是否缓存文件资源。
#EXT-X-ALLOW-CACHE:
3.4.7 EXT-X-PLAYLIST-TYPE
标明播放列表的类型信息,作用于整个播放列表文件,可选的。
#EXT-X-PLAYLIST-TYPE:
3.4.8 EXT-X-ENDLIST
标明其后再没有文件片,可以出现在播放列表文件的任意位置,但只能出现一次。
3.4.9 EXT-X-MEDIA
用于对统一内容会有不同翻译的媒体播放列表。属性有点多,而且感觉不是很重要,不翻了,自己看吧。
http://tools.ietf.org/html/draft-pantos-http-live-streaming-13
3.4.10 EXT-X-STREAM-INF
用于指定一个变化的流(多码流)。其属性提供了该可变留的一些信息。其标明它后面的URI是该可变流的一个可选项。
该标签不应出现在媒体文件播放列表中。
#EXT-X-STREAM-INF:
其属性定义如下:
BANDWIDTH : 指定码率的整数。应该为URI中文件片码流的上限,必须。
CODECS: 引号包含的字符串,内容为逗号分割的格式列表,每个格式标明一个媒体播放列表中的文件片的媒体取样类型。该属性属于推荐属性(should,但是不加好像也没事)。
RESOLUTION: 十进制坐标,标明资源的分辨率。
PROGRAM-ID: 实际使用中用到过,但是不知道其作用,文档中也没写。
还有一些其他的属性,去看英文吧。
3.4.11 EXT-X-DISCONTINUITY
标明前后两个文件片编码方式不连续,比如:
文件类型,track的类型和数量,编码参数,编码序号,时间戳序号等
#EXT-X-DISCONTINUITY
其不应出现在主播放列表中。实际中还没发现它的用处。
3.4.12 EXT-X-DISCONTINUITY-SEQUENCE
该标签允许多码流不同码流之间同步,并能够使多个流在它们的媒体播放列表文件中加入EXT-X-DISCONTINUITY标签。
#EXT-X-DISCONTINUITY-SEQUENCE:
其中number是一个十进制证书。不连续的文件片序列号必须是递增的。
一个媒体播放列表不能包含多于一个EXT-X-DISCONTINUITY-SEQUENCE标签。如果列表文件中不包含该标签,则文件列表中第一个文件片的不连续序列号标记为0。
本标签必须出现在第一个文件片之前,且必须出现在EXT-X-DISCONTINUITY标签前,且只能出现在媒体播放文件列表中 。
如果媒体列表文件中EXT-X-PLAYLIST-TYPE的值为VOD或者EVENT,则不可使用本标签。
3.4.13 EXT-X-I-FRAMES-ONLY
本选项标明播放列表文件中文件片都描述了一个I关键帧。本标签作用于整个播放列表文件。
#EXT-X-I-FRAMES-ONLY
在拥有 该标签的播放列表文件中,文件片的时长是从某一个I帧开始到另外一个I帧的出现或者文件列表末尾。
包含关键帧资源的媒体文件必须以传输流PAT/PMT开始,或者与EXT-X-MAP标签一起出现。
包含有EXT-X-BYTERANGE标签的I帧分片的字节范围不能包含PAT/PMT。本标签只应该出现在媒体文件列表中。
3.4.14 EXT-X-MAP
本标签用于说明如何获取用于解析媒体文件片的头部信息,比如传输流 PAT/PMT 或者WebVTT头。
它作用于其后出现的所有文件片,直到文件末尾或EXT-X-DISCONTINUITY出现。
#EXT-X-MAP:
选项情况如下:
URI:”string” ,指明包含头部信息的资源的URI,必须的。
BYTERANGE:”string”,指明URI资源的一定字节范围,可选的。不填写该属性时,指代URI所指的全部资源。
这个标签的使用情景:当播放列表文件中的第一个文件片在资源的开头部分没有和PAT/PMT紧随,且文件片带有EXT-X-I-FRAMES-ONLY标签。该标签不应出现在主列表文件中。
3.4.15 EXT-X-I-FRAME-STREAM-INF
本标签标明媒体播放列表文件包含多媒体内容的I-frame。本标签单独使用,不依赖于任何资源的URI。
#EXT-X-I-FRAME-STREAM-INF:
本标签支持所有EXT-X-I-FRAME-STREAM-INF支持的属性,并额外支持一个URI属性。
3.4.16 EXT-X-INDEPENDENT-SEGMENTS
本标签标明,一个分片可以独立解码而不需要其他分片的信息。本选项作用于列表文件中的所有项目。
#EXT-X-INDEPENDENT-SEGMENTS
本选项可选,但只能使用一次,当其放置在主列表文件中时,其作用于所有播放列表文件中的每一个文件片。貌似很有用啊。
3.4.17 EXT-X-INDEPENDENT-SEGMENTS
没太看懂他的作用,有时间测试了之后再翻译这段。
3.4.18 EXT-X-VERSION
本标签标明播放列表文件兼容版本。
#EXT-X-VERSION:
这个标签没啥意思,自己看看吧。
hls协议地址 :http://tools.ietf.org/html/draft-pantos-http-live-streaming-13#section-3.4.11