HLS协议详解
HTTP Live Streaming简称HLS是由Apple提出的基于HTTP的流媒体网络传输协议技术最早应用在iOS相关的设备上比如iPhoneiPadApple TVmacOS电脑等。很多web服务器都能够支持HLS协议的对外服务比如Adobe Flash Media Server、Flussonic Media Server、RealNetworks、Microsoft IIS Media Services、Nginx、VLC、Wowza Media Server等等。客户端支持的类型也很广泛比如iOSAdobe Flash PlayerAndroidJWPlayerwin10的EDGE浏览器等等因此很多系统的默认播放器都能较好支持常用比较多的Media Player、VLC、ffplayer等也都能较好支持。
1.特点
支持直播、时移和点播
同一个视频支持多个码率的码流
支持根据网络带宽情况自动切换码率码流
支持视频加密和用户身份认证
采用索引文件与分片的方式伪直播流但很适合CDN等缓存处理
视频的分片一般建议10s太短的话容易造成分片碎片化太多太长的话容易造成直播的时延较长
2.框架
下图为HLS流媒体协议技术中涉及到的各个部分引自Apple官网
3.文件构成及编解码
HLS是由m3u8索引文件和一系列ts切片文件构成。其中m3u8文件实际上就是一个播放列表Media Playlist or Master Playlist其中Media Playlist可以简单认为是直接索引到视频文件而Master Playlist会有多层级的m3u8嵌套因此有了master主的概念但框架本质上大同小异。
3.1 索引文件中分片文件的类型
支持相对路径比如
支持绝对路径比如
3.2 m3u8文件格式要求
必须以UTF-8进行编码不能包含BOM不能包含UTF-8控制字
每行必须是URI或是空行或是以#开头
文件中的每行以#开头时是注释或是标签
标签以#EXT开头大小写敏感
3.3 属性列表Attribute Lists
标签后面的值为属性列表以逗号作为分隔符分离出不带空格的属性.值对。
属性值.对的语法为AttributeName=AttributeValue比如BANDWIDTH=64000
3.4 标签Tag
基础标签Basic Tags
EXTM3U以#EXTM3U作为标志说明是M3U的文件所有HLS的m3u8 playlist文件都必须带上这个标志并且往往放在第一行。
EXT-X-VERSION指协议相关版本号与流媒体的兼容性有关并且在一个m3u8文件内只能一个version定义。
切片标签Media Segment Tags下述标签不会出现在Master Playlist文件中。
EXTINF指其随后的视频文件的时长单位s。每个视频片段都必须指定该标签一般为浮点型并且其值必须<=EXT-X-TARGETDURATION的值
EXT-X-BYTERANGE指接下的切片是其后URI指定的视频源的局部。没有指定时表明为整个URI资源
EXT-X-DISCONTINUITY指前后分片之间存在中断主要应用在视频中插入广告的场景表明不是同一份视频源中间的切换用该标签指示。
EXT-X-KEY主要是用来对ts文件进行加密一般的属性有加密方法如METHOD-AES128等URI-主要指key存放的路径等。
EXT-X-MAP获取视频媒体的Intialization section
播放列表标签Media Playlist Tags在Playlist文件中最多只能出现一次也不能出现在Master Playlist中。
EXT-X-TARGETDURATION必须标签指每个视频分片最长的时长单位s。
EXT-X-MEDIA-SEQUENCE指播放列表中第一个分片的序列号每个分片都有唯一的序列号整数并且依次累加1若无指定默认从0开始。这个在回看时大的Playlist中要分隔开小的Playlist很有用。
EXT-X-ENDLIST指m3u8文件的结束一般放在结尾放置时一般认为是点播。
EXT-X-PLAYLIST-TYPE指流媒体的类型VOD一般指点播服务器不能更改m3u8EVENT指直播不能更改或删除该文件任意内容但是可在末尾添加新内容。
EXT-X-I-FRAMES-ONLY指每个分片都是I帧
主播放列表标签Master Playlist Tags会对多个不同的视频流文件进行说明也不能出现在Media Playlist文件中。
EXT-X-MEDIA主要指定相同内容但是多种语言的list
EXT-X-STREAM-INF指定了视频流文件的相关信息包含如下属性值
URI指多个视频源中的一个对应的地址必选
BANDWIDTH网络带宽如果写入客户端可根据自身网络情况并结合该项进行不同视频流切换。必选。
AVERAGE-BANDWIDTH各个视频源的平均码率非必选。
CODECS由双引号内的值组成并由逗号分隔。一般必选吧。内容为h264aac等。
RESOLUTION视频源的分辨率非必选也是作为多个视频源间切换的依据。
FRAME-RATE视频源的帧率一般默认是30帧非必选。
EXT-X-SESSION-KEY主要用于各个视频源的加密
Media or Master Playlist Tags可在Media Playlist和Master Playlist中都进行设置但也最多只能出现一次。
EXT-X-START客户端开始播放的位置非必选
3.5 音视频编码格式
分片的封装格式为ts
视频编码格式可以支持mpeg2h262、h264、h265等
音频编码格式可以支持aac、ac3、dts等
需要注意的是如果hls在web端播放时最好采用aac音频格式否则可能会导致有画面没有声音的现象。
3.6 汇总注意事项
在解析时自动忽略空行和注释行
Media Playlist类型的视频源的总时长=各切片资源的时长和
每个切片的码率=切片大小/对应时长EXTINF的时长
在Media Playlist中EXT-X-TARGETDURATION 指定的时长不能进行更改一般为10 秒。
4.点播
点播m3u8索引文件解析后内容如下
相关参数定义见3中的说明。对于点播客户端只需要按m3u8索引文件中的顺序下载片段资源就可以进行播放了。
5.直播
直播m3u8索引文件解析后内容如下
相关参数参见3中的说明。从上面中可以看到与点播相比是没有【EXT-X-ENDLIST】标签的。客户端需要定时重新请求m3u8文件查看是否有新的片段数据需要重新下载并播放现在很多系统的播放器都能够很好地处理。
6.码流自适应
这里就是上面提到的Master Playlist一级m3u8文件解析后类似如下
上述的相关参数详见3中的说明。相应展开后的文件信息如下图所示一级main.m3u8包含各级的m3u8不同分辨率码率各分辨率又由ts文件构成组成了video chunks。播放器客户端在播放视频时会根据自身的网络状况选择合适的码流进行播放比如当前带宽只适合播放14M以内的视频那将在上述列表中找到可以播放的最佳的码率的视频。为此在设置码率时也要尽量根据场景设置好不同的码率。
上述图片引自tothenew
7.加密encryption
HLS支持对视频文件ts进行加密m3u8是索引文件不存在加密一说。虽然有很多加密的算法但是HLS只支持AES-128加密。这种加密方式能够避免ts视频文件被获取后就能盗播的问题必须要相应的KEY才能进行播放。下面的m3u8文件解析后可以看到加密后的相关信息
分析如下
1.上述视频为点播。
2.采用AES-128加密获取秘钥的地址为https://hlsbook.net/enc.key一般来说这两个值就已经说明了加密的相关信息但有时候也会带上属性IV。因为AES-128在加解密时需要提供一个16字节的初始化向量IV变换IV以提高秘钥的健壮性。如果有IV值则将该值作为初始化向量并且解释为128位的16进制数前缀0x如果没有IV值则按序列号作为IV值不足部分左边补0。在使用中也是会建议填写上这个IV值。
3.加密是对所有分片文件进行加密大部分用于点播场景居多直播上相对较少因为本身HLS直播的时延就比其他技术的要长不少如果加上了加密方式虽然保护性高但是播放器客户端还需要额外的时间进行解密延时更长。
4.一般的HLS加密视频普通的播放器就能正常播放比如VLC因为直接可以从URI中获取到秘钥。这种方式虽然对于视频内容做了加密但是如果破解了m3u8秘钥也会被很轻易获取。现有的很多厂商的做法是在URI侧加了多层机制来进行保护级别上根据不同的情况做不同的处理比如
秘钥的URL一般是https请求
URL中会加上其他的token信息便于进行时间戳校验这种普通播放器就能进行播放了。
有些厂商也会在token中加上身份信息便于进行身份校验如果加了这种方式普通播放器往往无法播放需要与之匹配的定制播放器才能对视频做真正的解析。
7.参考
https://developer.apple.com/documentation
https://tools.ietf.org/html/rfc8216
- 点赞
- 收藏
- 关注作者
评论(0)