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等也都能较好支持。
支持直播、时移和点播
同一个视频支持多个码率的码流
支持根据网络带宽情况自动切换码率码流
支持视频加密和用户身份认证
采用索引文件与分片的方式,伪直播流,但很适合CDN等缓存处理
视频的分片一般建议10s,太短的话容易造成分片碎片化太多,太长的话容易造成直播的时延较长
下图为HLS流媒体协议技术中涉及到的各个部分,引自Apple官网
HLS是由m3u8索引文件和一系列ts切片文件构成。其中m3u8文件实际上就是一个播放列表(Media Playlist or Master Playlist),其中Media Playlist可以简单认为是直接索引到视频文件,而Master Playlist会有多层级的m3u8嵌套,因此有了master(主)的概念,但框架本质上大同小异。
3.2 m3u8文件格式要求
3.3 属性列表Attribute Lists
3.4 标签Tag
基础标签Basic Tags
切片标签Media Segment Tags,下述标签不会出现在Master Playlist文件中。
Media or Master Playlist Tags,可在Media Playlist和Master Playlist中都进行设置,但也最多只能出现一次。
3.5 音视频编码格式
分片的封装格式为ts;
3.6 汇总注意事项
点播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索引文件中的顺序下载片段资源,就可以进行播放了。
直播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文件,查看是否有新的片段数据需要重新下载并播放,现在很多系统的播放器都能够很好地处理。
这里就是上面提到的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以内的视频,那将在上述列表中找到可以播放的最佳的码率的视频。为此,在设置码率时,也要尽量根据场景设置好不同的码率。
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
分析如下:
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