HTTP Live Streaming


1.HLS

         HLS 提供了一个可靠的,性价比高的通过互联网传输连续的,持续时间长的视频的方案。它允许接收者调节视频的比特率来适应不断变化的带宽来提供良好的视频播放体验。它支持无界视频传输。它能有效的完成对同一内容的不同翻译,比如说音频解析。它同时提供了大规模的HTTP缓存机制用来支持传输给大量受众。

         它的第一个版本在2009年推出,HLS已经被很多供应商广泛的实现部署。

         这份文档的目的是通过描述传输协议来提高HLS的互操作性。使用HLS可以在接收连续视频的同时实现播放。这份文档描述的是HLS的版本7.

2. HLS概览

        多媒体通过一个播放列表的唯一表征符(URI)来标识。

        播放列表可以是一个媒体列表,也可以是一个控制列表。两种都是包含URI和描述标签的文本文件。

        媒体播放列表包含媒体块的列表,这些媒体块会顺序播放。

       下面是一个媒体播放列表的示例:

   #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。第二行是媒体块的长度。只能与这个长度相同或者是比这个长度小。接下来是三个视频块。

        客户端首先下载这个播放列表,然后顺序下载每一个声明在播放列表的媒体块。客户端会重新下载播放列表以便于发现新添加的媒体块。数据通常是使用HTTP传输,但是如果需要,每一个链接可以指定所使用协议。

        更复杂的表现形式可以通过控制列表来描述。控制列表包含一系列不同的替换流,每一个描述了同一内容的不同版本。一个替换流说明了多媒体的编码比特率,编码形式,以及特定的视频框大小的说明。

        替换流同时可以有一系列的描写。描写是同一内容的不同替换版本,就像不同语音或者不同视角的视频。

        播放器可以咋不同的替换流和描述间转换来适应网络状况和用户习惯。

3. 媒体块

        播放列表包含一系列的媒体块。所有的媒体块组合在一起就是一个整体的多媒体。每一个媒体块通过URI来鉴定,并且还有一个可选的字节范围。

        每一个媒体块的长度通过播放列表中的EXTINF标签来标识。

        播放列表中的每一个块包含一个唯一的数字编号。第一个块或者是0编号,或者是在播放列表中声明。后续的每一个媒体块的编号依次递增1

        每一个媒体块必须是MPEG-2 ts[1]MPEG音频元素流,或者WebVTT文件格式。传输其他文件格式是未定义的行为。

        有些媒体格式在解析之前要求有已经初始化的有一串相同数据的解析器。这个特定序列是媒体初始化部分。MPEG-2 TS 流的初始化部分是PAT(Program Associated Table)跟着PMT (Program Map Table)WebVTT的初始化部分是WebVTT的头部分。音频流没有初始化部分。

        TS流的媒体块只能包含单一的节目,如果播放多个节目的行为是未定义的。每一个TS流媒体块应该包含PATPMT在块的起始部分。或者在播放列表中声明媒体块的初始化部分。所有在相应PAT/PMT 部分被读取之前得到的TS流块可以直接丢弃。

        一个包含视频内容的媒体块应该至少有一个关键帧,并且提供足够的信息来初始化视频解码器。

        每一个媒体块必须是连续编码的媒体,并且有连续的编号和时间戳。唯一的例外是出现在播放列表中的视频块,媒体块显示的声明为不连续。没有标记的不连续媒体会导致播放错误。

4. 播放列表

        每一个播放列表可以是URI来指定或者是HTTP的内容类型。如果是URI,必须以m3u8或者m3u结尾。如果是HTTPContent-Type,必须是application/vnd.apple.mpegurl或者audio/mpegurl客户端应该拒绝解析其他类型。

4.1 播放列表的定义

        每一行以换行符结束。每行可以是空行,URI,或者以#开头。空行被忽略。

        以#开头的可以是注释或者标签。标签以#EXT开头,大小写敏感。其他都是注释。

        URI或者是媒体块或者是播放列表。每一个媒体块由一个URI和标签来说明。

        如果一个播放列表中的URI都标识媒体块,则它是媒体列表。如果URI都是播放列表,则他是控制列表。一个播放列表只能是播放列表或者是控制列表。

        每一个URI或者是绝对的或者是相对的,如果是相对的,则该相对于包含它的列表的URI

        播放列表的长度是它里面所有媒体块的长度和。

        媒体块的比特率是块大小除以EXTINF指定的长度。

        峰值比特率是文件中最大的比特率。

        平均的比特率是所有块大小的和除以所有块的时间。

4.2 属性列表

        一些标签可以有属性。属性列表由逗号分割,中间不能有空格。

       属性/值对有以下语法形式:

            AttributeNameAttributeValue

       属性名称由以下字符构成[A-Z],[0-9] ’-‘

       值可以是以下几种中的一种:

·      十进制数字,64位为极限

·      十六进制,以0x或者0X开头

·      浮点数

·      字符串

·      枚举字符串,属性预定义的字符串

·      视频框大小 100x1000pixel

每个属性名在一个属性列表中只能出现一次。

4.3 播放列表标签

        播放列表标签说明全局参数,或者它们之后出现的媒体块或者播放列表的信息。

4.3.1 基本标签

1.    EXTM3U:这个标签表明此文件是一个扩展的M3U播放列表文件。必须是文件的第一行并且有以下形式:#EXTM3U

2.    EXT-X-VERSION:说明播放列表的版本。格式为:#EXT-X-VERSION:<n>n是一个整数,必须出现在播放列表中所有与之前版本不兼容部分之前。每个文件中至多有一个这个属性。

4.3.2 媒体块标签

        每一个媒体块由一系列的媒体块标签尾随一个URI来说明。有些标签只对它后面的一个标签有效,有些标签会对整个文件的媒体块有效。

1.    EXTINF:用来说明每个媒体块的长度。只对下一个媒体块有效,每一个媒体块之前必须有这个标签。它的形式是: #EXTINF: <duration>,<title>duration是一个十进制整数或者浮点数,用来说明媒体块的长度。版本3之前只支持整形。版本3之后应以浮点数为主。title是可选的人可读的形式。

2.    EXT-X-BYTERANGE:此标签用来说明一个媒体块的范围。只对它后面的一个媒体块有效。形式为:#EXT-X-BYTERANGE:<n>[@<o>]n是一个十进制的整数说明范围的长度。如果有o,它是这个范围的起始位置,如果没有,那么默认的起始位置是上一块的结束位置的下一个字节。同时,没有o时,它的前面必须要有一个媒体块。没有这个标签的媒体块表示该链接所指示的整个长度。这个标签要求版本4及以上。

3.    EXT-X-DISCONTINUITY:这个标签说明该标签前后的媒体块不是连续的。格式为#EXT-X-DISCONTINUITY有以下情况出现,则必须使用此标签1.文件格式变化;2. track的编号,类型和标识发生变化;3. 时间戳序列发生变化。有以下情况,应该使用此标签:1.编码参数发生变化;2. 编码序列发生变化。

4.    EXT-X-KEY: 对于加密的视频流,说明如何解密该媒体块。格式为:#EXT-X-KEY:<attribute-list>METHOD(加密方法, NONEAES-128SAMPLE-AES)URI(引号阔起来的字符串,如果加密方法时NONE,必须有这个属性);IV(初始化向量,用来说明密钥);KEYFORMATKEYFORMATVERSIONS

5.    EXT-X-MAP:用来说明解析媒体块的初始化部分。对其后的所有媒体块有效,直到下一个此标签。形式为#EXT-X-MAP:<attribute-list>。以下属性有定义:URI(指向媒体初始化部分的链接,这个属性必须有,如果出现这个标签);BYTERANGE(同2中的范围,这个属性是可选的,这个范围应该只包括初始化部分)。版本5以上。

6.    EXT-X-PROGRAM-DATE-TIME:这个标签把第一个媒体块和绝对日期关联起来,只对后一个媒体块有效。形式为:#EXT-X-PROGRAM-DATE-TIME:<YYYY-MM-DDThh:mm:ssZ>。例子:#EXT-X-PROGRAM-DATE-TIME:2010-02-19T16:56:26.036+08:00。需要提供毫秒级的精度。

4.3.3 播放列表标签

        播放列表标签描述了播放列表的全局参数。每个标签至多出现一次。播放列表标签不能出现在控制列表中。

1.    EXT-X-TARGETDURATION:此标签说明了每个媒体块的最大时间长度。每个媒体块的EXTINF标签说明的长度当约到最近的整数时,必须要小于等于这个标签指明的长度。形式为#EXT-X-TARGETDURATION:<s>s时一个十进制整数。

2.    EXT-X-MEDIA-SEQUENCE:这个标签指定了第一个媒体块的编号。形式为:#EXT-X-MEDIA-SEQUENCE:<number>number时一个十进制整数。如果播放列表里没有这个标签,则第一个媒体块的编号为0。不同流的相同编号指定不同内容。这个标签必须出现在第一个媒体块之前。

3.    EXT-X-DISCONTINUITY-SEQUENCE:用来同步相同或者不同的替换流。语法形式为:#EXT-X-DISCONTINUITY-SEQUENCE:<number>number是一个十进制整数。必须出现在第一个媒体块之前。

4.    EXT-X-ENDLIST:标识播放列表的结束。

5.    EXT-X-PLAYLIST-TYPE:用来标识播放列表是否可变。对整个播放列表有效。这个标签可选。形式为:#EXT-X-PLAYLIST-TYPE:<EVENT|VOD>EVENT表明媒体块只能在播放列表的末尾添加。如果为VOD,则整个列表不能改变。如果没有这个标签,则播放列表可以更新(根据第六部分的规则)并且没有限制。

6.    EXT-X-I-FRAMES-ONLY: 这个标签表明列表中的每个媒体块是一个单独的I-FrameI-frame是不依赖于任何其他帧的帧。这个标签应用于整个播放列表。形式为:#EXT-X-I-FRAMES-ONLY。包含I-frame的媒体资源必须包含初始化部分或者有EXT-X-MAP标签。版本4及以上。

4.3.4 控制列表标签

        控制列表标签定义替换流,描述,和其他用于表现(presentation)的全局参数。

        控制列表标签不能出现在播放列表中。

1.     EXT-X-MEDIA:用来关联相同内容的不同替换流的播放列表。形式为:#EXT-X-MEDIA:<attribute-list>。其中定义的属性有:TYPEAUDIO,VIDEO, SUBTITLES, CLOSED-CAPTIONS,指定错误的类型会导致播放错误);URI(字符串,可选,如果类型是CLOSED-CAPTAIONS,不能有这个属性);GROUP-ID(字符串,说明描述所属的组);LANGUAGE(字符串,说明主要语言);ASSOC-LANGUAGE(字符串,描述的语言,可选);DEFAULT(枚举字符串,YESNO,可选属性,YES表明视频播放不需要用户参与);AUTOSELECT(可选,YESNO,没有此属性表示NOYES表示没有用户显示的喜好倾向,如果有DEFAULT,此属性必须为YES);FORCED(可选属性,YESNO,没有此属性默认为NO,只有播放类型为SUBTITLES时,才能有这个属性,NO表示用户请求播放);INSTREAM-ID(如果类型为CLOSED-CAPTIONS,必须有这个属性);CHARACTERISTICS(可选)

2.     EXT-X-STREAM-INF:声明一个替换流。属性列表提供替换流的信息。形式为:#EXT-X-STREAM-INF:<attribute-list>
<URI>
定义的属性为:BANDWIDTH(替换流的峰值比特率,必须属性)AVERAGE-BANDWIDTH(替换流的平均比特率,可选属性);CODECS(逗号分割的格式,应该有);RESOLUTION(替换流的合适播放大小,可选);AUDIOVIDEOSUBTITLESCLOSED-CAPTIONS

3.     EXT-X-I-FRAME-STREAM-INF:包含I-frames的多媒体。

4.     EXT-X-SESSION-DATA:允许控制列表中有随意的会话数据。

4.3.5 媒体/控制列表标签

        可以出现在播放列表和控制列表中,如果出现在控制列表中,播放列表中不需要有,如果有且值不同,将被忽略。

1.     EXT-X-INDEPENDENT-SEGMENTS:每个媒体块都可以被独立解码。对整个列表有效。

2.     EXT-X-START:指明倾向的开始播放的位置。

5. 密钥文件

5.1 密钥文件结构

        16-八进制密钥。

5.2 AES_128初始化向量

6. 客户端/服务器职能

6.1 简介

        这部分介绍服务器如何产生播放列表和媒体块以及客户端如何下载并且播放。

6.2 服务器的职责

6.2.1 服务器的一般职责

        服务器负责把媒体文件分割成为单独的媒体块。长度必须要比声明的目标长度要短或者相同。

        服务器应该尝试把源分割为可以高效解码。以包为分界或者密钥帧分界。同时还应该为每个媒体块分配一个URI。所有在播放列表中声明的媒体块必须已经可以被请求,否则会发生播放错误。

        如果客户端接收gzip形式,服务器应该用gzip传输。

6.2.2 直播列表

6.2.3 加密媒体块

        每个包含加密部分得媒体流,必须要包含一个EXT-X-KEY字段,来指定密钥得位置。不加密得部分必须指定加密方法为NONE

6.2.4 提供替换流

        客户端会自行切换视频得比特率。

        限制如下:

·       每一个替换流必须是相同的内容;

·       相同的内容在不同的替换流中必须有相同的时间戳;

·       不同替换流中相同的内容必须有相同的编号;

·       不同替换流中相同的媒体块必须是相同的时间长度;

·       在一个替换流中出现而没有在其他替换流中出现必须在播放列表的第一个或者最后一个;

6.3 客户端的职责

6.3.1 客户端一般职责

        检查m3u8的合法性是客户端的职责。

6.3.2 下载媒体播放列表文件

1.     客户端负责决定下载哪一块媒体块。

2.     如果媒体播放列表文件中包含EXT-X-MEDIA-SEQUENCE标签,客户端应该知道里面标识的每一块媒体块都可能消失。

3.     客户端可能会通过编号来定位媒体块,当一个媒体播放列表被重新下载之后。

4.     不同的替换流中的编号可能不同,客户端不应该做任何假设。应该使用相对位置或者是不连续编号。

5.     客户端必须下载每一个媒体播放列表文件用来播放。

6.     对于某些替换流可能不包含媒体块,客户端应该避免播放该媒体流。

6.3.3 播放媒体播放列表文件

        客户端不能播放丢失超过三个媒体块长度的媒体播放列表,这样的文件会导致播放错误。

6.3.4 重新下载媒体播放列表文件

        客户端必须持续更新媒体播放列表,除非EXT-X-PLAYLIST-TYPE标签出现,并且有end标签。

6.3.5 决定下一个要下载的媒体块

        每次下载媒体块之前都需要检查媒体播放列表。

        第一个下载的媒体块是客户端选择要播放的第一个。要下载的下一个媒体块是最小的比前一个下载好的媒体块编号大的媒体块。

6.3.6 解密加密的媒体块

        首先,客户端需要获得EXT-X-KEY标签指定的密钥文件。客户端不应该尝试解密它不知道加密方法的已加密的媒体块。

7. 协议版本的兼容性

        如果客户端不支持该版本的协议,客户端不应该尝试播放该媒体流。

1.     如果包含EXT-X-KEY标签的IV属性,至少要求版本2的协议。

2.     如果包含EXT-INF使用浮点数时,至少要版本3的协议。

3.     EXT-X-BYTERANGE标签和EXT-X-I-FRAMES-ONLY标签至少要版本4以上。

4.     EXT-X-KEY标签的KEYFORMATKEYFORMATVERSIONS属性和EXT-X-MAP标签至少要版本5以上。

5.     包含EXT-X-MAP并且不包含EXT-I-FRAMES-ONLY标签至少要版本6

6.     EXT-X-MEDIA标签的INSTREAM-ID属性的SERVICE值至少要版本7

8. 播放列表示例

8.1 简单的媒体播放列表

   #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

   #EXT-X-ENDLIST

8.2 直播媒体播放列表,使用HTTPS

   #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

8.3 包含加密媒体块的播放列表

   #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

8.4 控制播放列表

   #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

8.5 包含I-Frames的控制列表

   #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

8.6 包含替换音频的控制列表

   #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

8.7 包含替换视频的控制列表

   #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-STREAM-INF:BANDWIDTH=65000,CODECS="mp4a.40.5"

   main/audio-only.m3u8

8.8 控制列表中的会话数据

   #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="sp",VALUE="Estees un ejemplo"

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值