HTTP Live Streaming-HLS学习
此博客素材主要来自于 Apple开发者文档,这里做一个简要的翻译及学习
目录
目录
HTTP流架构
HTTP Live Streaming允许从普通的Web服务器向*Apple系列产品或支持hls协议的产品,发送实时或预先录制的音频和视频,并支持加密和身份验证。
概述
从概念上讲,HTTP Live Streaming由三个部分组成:服务器组件,分发组件和客户端软件。
服务器组件是负责采取的媒体输入流和数字编码它们,以适合于递送的格式将它们封装,以及制备所述包封的媒体分发。
分配组件包括标准的Web服务器。他们负责接受客户的请求,并将准备好的媒体和相关资源交付给客户。对于大规模分发,还可以使用边缘网络或其他内容传递网络。
客户端软件负责确定适当的媒体请求,下载这些资源,然后重新装配即可,使得介质可以在一个连续的数据流被呈现给用户。客户端软件包含在iOS 3.0和更高版本以及装有Safari 4.0或更高版本的计算机上。
在典型配置中,硬件编码器接受音频视频输入,将其编码为H.264视频和AAC音频,然后以MPEG-2传输流的形式输出,然后由软件分解为一系列简短的媒体文件流分割器。这些文件放置在Web服务器上。分段器还创建并维护包含媒体文件列表的索引文件。索引文件的URL在Web服务器上发布。客户端软件读取索引,然后按顺序请求列出的媒体文件并显示它们,而各段之间没有任何暂停或间隙。
一个简单的HTTP流配置的示例如图1-1所示。
图1-1 基本配置
输入可以是实时输入,也可以来自预先录制的源。它通常被编码为MPEG-4(H.264视频和AAC音频),并通过现成的硬件打包在MPEG-2传输流中。然后将MPEG-2传输流分成多个部分,并保存为一系列一个或多个.ts
媒体文件。通常使用诸如Apple Stream Segmenter之类的软件工具来完成此操作。
纯音频流可以是一系列MPEG基本音频文件,格式为具有ADTS标头的AAC,MP3或AC-3。
分段器还会创建一个索引文件。索引文件包含媒体文件列表。索引文件还包含元数据。索引文件是一个.M3U8
播放列表。客户端访问索引文件的URL,然后客户端按顺序请求索引文件。
上面一段应当注意的几个点:
- hls支持的音视频编码格式是有限制的
- 切片文件ts和索引文件m3u8的产生与使用
- 纯音频流的格式
服务器组件
该服务器需要一个媒体编码器(可以是现成的硬件),以及一种将编码后的媒体分成多个片段并将其保存为文件的方法,该文件可以是Apple提供的媒体流分段器之类的软件,也可以是一部分集成的第三方解决方案。<编码+切片功能>
媒体编码器
媒体编码器从音频视频设备获取实时信号,对媒体进行编码,然后封装以进行传输。编码应设置为客户端设备支持的格式,例如H.264视频和HE-AAC音频。当前,支持的传递格式是用于音频视频的MPEG-2传输流,或仅用于音频的MPEG基本流。
编码器通过本地网络将MPEG-2传输流中的编码媒体传递到流分段器。MPEG-2传输流不应与MPEG-2视频压缩混淆。传输流是一种打包格式,可以与许多不同的压缩格式一起使用。该音频技术和视频技术列表支持的压缩格式。
重要提示: 视频编码器不应在对流进行编码的过程中更改流设置,例如视频尺寸或编解码器类型。如果流设置的更改不可避免,则必须在段边界处更改设置,并且EXT-X-DISCONTINUITY
必须在以下段上设置标签。
流分割器
流分段器(即切片软件、切片工具)是一个过程(通常是软件),可从本地网络读取传输流并将其分为一系列等长的小型媒体文件。即使每个段都在单独的文件中,视频文件还是由可以无缝重构的连续流制成的。
分段器还会创建一个索引文件,其中包含对各个媒体文件的引用。每次分段程序完成一个新的媒体文件时,索引文件都会更新。该索引用于跟踪媒体文件的可用性和位置。分段器还可以加密每个媒体分段并创建密钥文件作为该过程的一部分。
媒体段另存为.ts
文件(MPEG-2传输流文件)。索引文件另存为.M3U8
播放列表。
切片工具将视频流进行切片,得到分段视频文件.ts和索引文件.m3u8
注意:此处的索引文件m3u8与本地视频切片得到的m3u8文件不同
文件分割器
如果已经有使用支持的编解码器编码的媒体文件,则可以使用文件分段器将其封装在MPEG-2传输流中,并将其分成相等长度的段。文件分段器使您可以使用现有音频和视频文件的库,以通过HTTP Live Streaming按需发送视频。文件分段器执行与流分段器相同的任务,但是它将文件而不是流作为输入。
媒体片段文件
媒体分段文件通常由流分段器根据来自编码器的输入生成,并且由一系列.ts
文件组成,这些文件包含MPEG-2传输流的片段,这些片段承载H.264视频和AAC,MP3或AC-3音频。对于纯音频广播,分段器可以生成MPEG基本音频流,其中包含带有ADTS标头的AAC音频,MP3音频或AC-3音频。
索引文件(播放列表)
索引文件通常由流分段器或文件分段器生成,并保存为.M3U8
播放列表,这是.m3u
用于MP3播放列表的格式的扩展。
这是一个非常简单的索引文件示例(以.M3U8
播放列表的形式),如果整个流都包含在三个未加密的10秒媒体文件中,则分段程序可能会生成该文件:
#EXT-X-VERSION:3
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:1
#旧式整数持续时间;新版用户避免使用
#EXTINF:10,
http://media.example.com/segment0.ts
#新型浮点持续时间;用于新版用户
#EXTINF:10.0,
http://media.example.com/segment1.ts
#EXTINF:9.5,
http://media.example.com/segment2.ts
#EXT-X-ENDLIST
注意: 您可以使用Apple提供的文件分段器,以MPEG-4视频或AAC或MP3音频文件为源来生成各种示例播放列表。有关详细信息,请参见媒体文件分段器。
索引文件还可以包含用于加密密钥文件的URL和用于不同带宽的备用索引文件。有关索引文件格式的详细信息,请参见HTTP Live Streaming规范的IETF Internet草案。
索引文件通常由创建媒体片段文件的同一片段创建器创建。或者,可以.M3U8
独立创建文件和媒体段文件,只要它们符合已发布的规范。例如,对于仅音频广播,可以.M3U8
使用文本编辑器创建文件,列出一系列现有.MP3
文件。
以下将从简单的定义和几个索引文件示例来说明,然后通过官方的文档来明确各个部分含义。
一些简单的定义:
播放列表文件中的行由单个换行符终止,字符或回车符后跟换行符
特点是每行是一个URI,空白或以字符 '#'开头
空行将被忽略。
除了明确指定的元素。
以字符“#”开头的行是注释或标记。
标签以#EXT开头。它们区分大小写。
所有其他行以'#'开头的是注释,可以忽略。
索引文件示例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
#EXTM3U是格式标识符标签。
#EXT-X-TARGETDURATION 10表示所有媒体细分都将控制在10秒以内。
然后声明三个媒体段,第一和第二的长度为9.009秒;第三是3.003秒。
索引文件示例2
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:5.483333,
000000.ts
#EXT-X-ENDLIST
#EXT-X-VERSION:3表示版本
#EXT-X-MEDIA-SEQUENCE:0表示文件序号
#EXT-X-PLAYLIST-TYPE:VOD表示类型- -vod表示点播
#EXTINF:5.483333表示第一段的持续时间
000000.ts表示第一段视频切片的名字
#EXT-X-ENDLIST表示此索引结束
官方文档
官方文档:网址- -参见第四部分
一些常见的标签定义:
EXTM3U
此标签指示文件类型为Extend M3U,必须在每个索引文件的第一行
EXT-X-VERSION
此标签指示播放列表版本,并应用于整个索引文件
格式为 #EXT-X-VERSION:<n> //n为整数
例:EXT-X-VERSION:3
此标签有且只能有一个,一般来说都有
EXTINF
此标签表示媒体切片长度,每一个切片都需要此标签
格式为: #EXTINF:<duration>,[<title>]
其中duration为十进制浮点数或十进制整数,指定了媒体片段的时间(以秒为单位)。
通常,持续时间应为十进制-浮点数,具有足够的精度,
EXT-X-KEY
媒体段可以加密。 EXT-X-KEY标记指定如何
解密它们。它适用于在
与播放列表文件中的下一个EXT-X-KEY标签相同
KEYFORMAT属性(或播放列表文件的末尾)。两个或更多
具有不同KEYFORMAT属性的EXT-X-KEY标签可以应用于
如果最终产生相同的解密,则使用相同的媒体段
钥匙。格式为:#EXT-X-KEY:<属性列表>
定义了以下属性:
方法
该值是一个指定加密的枚举字符串。
方法。此属性是必需的。定义的方法为:NONE,AES-128和SAMPLE-AES。
NONE的加密方法表示媒体段不是
加密。如果加密方法为NONE,则其他属性
一定不存在。AES-128信号的加密方法是媒体段是
使用高级加密标准完全加密
[AES_128],具有128位密钥,密码块链接和PKCS7
填充[RFC5652]。 CBC在每个细分市场边界处重新启动,
使用IV属性值或媒体序列号
作为IV;参见第5.2节。SAMPLE-AES的加密方法意味着媒体段
包含加密的媒体样本,例如音频或视频
使用高级加密标准[AES_128]。这些媒体如何
流被加密并封装在一个段中取决于
媒体编码和细分的媒体格式。 fMP4媒体
使用Common的'cbcs'方案对段进行加密
加密[COMMON_ENC]。其他媒体细分的加密
包含H.264 [H_264],AAC [ISO_14496],AC-3 [AC_3],
HLS中描述了增强型AC-3 [AC_3]媒体流
样本加密[SampleEnc]规范。 IV属性MAY
出席;参见第5.2节。URI
该值是一个带引号的字符串,其中包含一个URI,用于指定如何
获取密钥。除非方法,否则此属性是必需的
没有。IV
该值为十六进制序列,它指定一个128位
要与密钥一起使用的无符号整数初始化向量。
使用IV属性需要兼容版本号
2或更大。有关何时使用IV属性的信息,请参见5.2节。键盘格式
该值是带引号的字符串,用于指定密钥的方式
在URI标识的资源中表示;见第5节
有关更多详细信息。此属性是可选的;它的缺席
表示“身份”的隐式值。 KEYFORMAT的使用
属性需要兼容版本号为5或更高。关键格式版本
该值是包含一个或多个正数的带引号的字符串
以“ /”字符分隔的整数(例如,“ 1”,“ 1/2”,
或“ 1/2/5”)。如果特定KEYFORMAT的版本超过一个
已定义,此属性可用于指示哪个
该实例符合的版本。该属性是
选修的;如果不存在,则将其值视为“ 1”。
使用KEYFORMATVERSIONS属性需要兼容性
版本号为5或更高。如果媒体播放列表文件不包含EXT-X-KEY标签,则
媒体段未加密。有关密钥文件的格式,请参见第5节;有关第5.2节,
有关媒体的其他信息,请参见第6.2.3节和第6.3.6节
段加密。
EXT-X-MAP
EXT-X-MAP标记指定如何获取媒体初始化
解析适用的媒体段所需的第3节。
它适用于在
播放列表,直到下一个EXT-X-MAP标签或直到
播放列表。其格式为:
#EXT-X-MAP:<属性列表>
定义了以下属性:
URI
该值是一个带引号的字符串,其中包含用于标识
包含媒体初始化部分的资源。这
属性是必需的。拜伦
该值是用引号引起来的字符串,指定到
URI属性标识的资源。这个范围应该
仅包含媒体初始化部分。的格式
字节范围在第4.3.2.2节中描述。该属性是选修的;如果不存在,则字节范围为整个字节范围
URI指示的资源。应该为播放列表中的媒体片段提供EXT-X-MAP标签
当第一个媒体细分(即,第一个媒体细分时,则使用EXT-X-I-FRAMES-ONLY标签)
I帧)(或
EXT-X-DISCONTINUITY标签)不会立即跟随媒体
资源开头的初始化部分。在包含以下内容的媒体播放列表中使用EXT-X-MAP标签
仅EXT-X-I-FRAMES标签需要兼容版本号5
或更高。在媒体播放列表中使用EXT-X-MAP标签
不包含EXT-X-I-FRAMES-ONLY标签需要兼容性
版本号为6或更高。
EXT-X-DATERANGE
EXT-X-DATERANGE标记与日期范围(即时间范围)相关联
由开始日期和结束日期定义),并带有一组属性/
值对。 其格式为:#EXT-X-DATERANGE:<属性列表>
EXT-X-TARGETDURATION标记指定最大媒体段
持续时间。播放列表
文件中每个媒体段的EXTINF持续时间四舍五入到最接近的整数时,必须小于或等于
目标持续时间;较长的片段会触发播放停顿
或其他错误。它适用于整个播放列表文件。其格式
为:#EXT-X-TARGETDURATION:<s>
其中s是十进制整数,指示目标持续时间(以秒为单位)。
需要EXT-X-TARGETDURATION标签
EXT-X-MEDIA-SEQUENCE
EXT-X-MEDIA-SEQUENCE标签指示
出现在播放列表文件中的第一个媒体段的媒体序列号。其格式
为:#EXT-X-MEDIA-SEQUENCE:<number>
,其中number是十进制整数。
如果媒体播放列表文件不包含EXT-X-MEDIA-SEQUENCE
标记,则
媒体播放列表中第一个媒体片段的媒体序列号应被视为0。客户端不得假定
具有相同媒体序列的片段不同媒体
播放列表中的编号包含匹配的内容-请参阅第6.3.2节。媒体段的URI不需要包含其媒体
序列号。看有关设置
EXT-X-MEDIA-SEQUENCE标签必须出现在
播放列表的第一个媒体片段之前。
EXT-X-ENDLIST标记指示没有更多的媒体段将被
添加到媒体播放列表文件。它可能出现在媒体
播放列表文件中的任何位置。其格式为:#EXT-X-ENDLIST
EXT-X-PLAYLIST-TYPE标记提供有关
媒体播放列表文件的可变性信息。它适用于整个媒体播放列表文件。
这是可选的。其格式为:#EXT-X-PLAYLIST-TYPE:<EVENT | VOD>
如果EXT-X-PLAYLIST-TYPE值为EVENT,则只能将媒体段
添加到媒体播放列表的末尾。
如果EXT-X-PLAYLIST-TYPE
值为VOD,则媒体播放列表无法更改。
如果EXT-X-PLAYLIST-TYPE标签从媒体播放列表省略,则
播放列表可以按照规则进行更新例如,可以更新一个实时播放列表以按照出现的顺序删除媒体片段。