HLS协议详解【转】

0.概述

HTTP Live Streaming,简称HLS,是由Apple提出的基于HTTP的流媒体网络传输协议技术,最早应用在iOS相关的设备上,比如iPhone,iPad,Apple TV,macOS电脑等。很多web服务器都能够支持HLS协议的对外服务,比如Adobe Flash Media Server、Flussonic Media Server、RealNetworks、Microsoft IIS Media Services、Nginx、VLC、Wowza Media Server等等。客户端支持的类型也很广泛,比如iOS,Adobe Flash Player,Android,JWPlayer,win10的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一般指点播,服务器不能更改m3u8;EVENT指直播,不能更改或删除该文件任意内容,但是可在末尾添加新内容。
      • EXT-X-I-FRAMES-ONLY:指每个分片都是I帧
        主播放列表标签Master Playlist Tags,会对多个不同的视频流文件进行说明,也不能出现在Media Playlist文件中。
      • EXT-X-MEDIA:主要指定相同内容但是多种语言的list
      • EXT-X-STREAM-INF:指定了视频流文件的相关信息,包含如下属性值
        在这里插入图片描述
        • URI:指多个视频源中的一个对应的地址,必选
        • BANDWIDTH:网络带宽,如果写入,客户端可根据自身网络情况,并结合该项进行不同视频流切换。必选。
        • AVERAGE-BANDWIDTH:各个视频源的平均码率,非必选。
        • CODECS:由双引号内的值组成,并由逗号分隔。一般必选吧。内容为h264,aac等。
        • RESOLUTION:视频源的分辨率,非必选,也是作为多个视频源间切换的依据。
        • FRAME-RATE:视频源的帧率,一般默认是30帧,非必选。
      • EXT-X-SESSION-KEY:主要用于各个视频源的加密
    • Media or Master Playlist Tags,可在Media Playlist和Master Playlist中都进行设置,但也最多只能出现一次。

      • EXT-X-START:客户端开始播放的位置,非必选
  • 3.5 音视频编码格式
    分片的封装格式为ts;

    • 视频编码格式可以支持mpeg2(h262)、h264、h265等
    • 音频编码格式可以支持aac、ac3、dts等
    • 需要注意的是,如果hls在web端播放时,最好采用aac音频格式,否则可能会导致有画面没有声音的现象。
  • 3.6 汇总注意事项

    • 在解析时自动忽略空行和注释行
    • Media Playlist类型的视频源的总时长=各切片资源的时长和
    • 每个切片的码率=切片大小/对应时长(EXTINF的时长)
    • 在Media Playlist中EXT-X-TARGETDURATION 指定的时长不能进行更改,一般为10 秒。

4.点播

点播m3u8索引文件解析后内容如下:

#EXTM3U
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
http://test.com/sequenceA.ts
#EXTINF:10.0,
http://test.com/sequenceB.ts
#EXTINF:10.0,
http://test.com/sequenceC.ts
#EXTINF:9.0,
http://test.com/sequenceD.ts
#EXT-X-ENDLIST

相关参数定义见3中的说明。对于点播,客户端只需要按m3u8索引文件中的顺序下载片段资源,就可以进行播放了。

5.直播

直播m3u8索引文件解析后内容如下:

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:4
#EXT-X-MEDIA-SEQUENCE:1
#EXTINF:10.0,
sequence1.ts
#EXTINF:10.0,
sequence2.ts
#EXTINF:10.0,
sequence3.ts
#EXTINF:10.0,
sequence4.ts
#EXTINF:10.0,
sequence5.ts

相关参数参见3中的说明。从上面中可以看到,与点播相比,是没有【EXT-X-ENDLIST】标签的。客户端需要定时重新请求m3u8文件,查看是否有新的片段数据需要重新下载并播放,现在很多系统的播放器都能够很好地处理。

6.码流自适应

这里就是上面提到的Master Playlist,一级m3u8文件解析后类似如下:

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://test.com/low/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=240000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://test.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=440000,RESOLUTION=416x234,CODECS="avc1.42e00a,mp4a.40.2"
http://test.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=640000,RESOLUTION=640x360,CODECS="avc1.42e00a,mp4a.40.2"
http://test.com/high/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=64000,CODECS="mp4a.40.5"
http://test.com/audio/index.m3u8

上述的相关参数详见3中的说明。相应展开后的文件信息如下图所示,一级main.m3u8包含各级的m3u8(不同分辨率码率),各分辨率又由ts文件构成,组成了video chunks。播放器客户端在播放视频时,会根据自身的网络状况选择合适的码流进行播放,比如当前带宽只适合播放14M以内的视频,那将在上述列表中找到可以播放的最佳的码率的视频。为此,在设置码率时,也要尽量根据场景设置好不同的码率。
上述图片引自tothenew

7.加密(encryption)

HLS支持对视频文件ts进行加密,m3u8是索引文件不存在加密一说。虽然有很多加密的算法,但是HLS只支持AES-128加密。这种加密方式能够避免ts视频文件被获取后,就能盗播的问题,必须要相应的KEY才能进行播放。下面的m3u8文件解析后可以看到加密后的相关信息:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="https://test.com/enc.key",IV=0xecd0d06eaf884d8226c33928e87efa33
#EXTINF:8.33333
sequence0.ts
#EXTINF:8.63333
sequence1.ts
#EXTINF:8.93333
sequence2.ts
#EXTINF:8.13333
sequence3.ts
#EXTINF:8.33333
sequence4.ts
#EXTINF:5.66667
sequence5.ts
#EXT-X-ENDLIST

分析如下:

  • 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中加上身份信息,便于进行身份校验,如果加了这种方式,普通播放器往往无法播放,需要与之匹配的定制播放器才能对视频做真正的解析。

8.参考

https://developer.apple.com/documentation
https://web.archive.org/web/20140212150813/http://tools.ietf.org/html/draft-pantos-http-live-streaming-11
https://tools.ietf.org/html/rfc8216

【说明】
文章转自,华为云社区,作者Higeeon,相关版权解释权归原作者所有。https://bbs.huaweicloud.com/blogs/c5de036bb1e411e9b759fa163e330718

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值