HLS介绍
HLS全称 HTTP Live Streaming ,是由苹果公司提出的⼀种基于 HTTP 的协议,⽤于解决实时⾳视频流的传输。尤其是在移动端,由于 iOS /H5不⽀持 flash,使得 HLS 成了移动端实时视频流传输的⾸选。HLS经常⽤在直播领域,⼀些国内的直播云通常⽤ HLS 拉流。
与RTMP不同的是,HLS只请求基本的HTTP报文。与实时传输协议(RTP)不同的是,HLS可以穿过任何允许HTTP数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。
HLS的优势:
HLS的劣势:
HLS工作流程
HLS 支持直播或者点播,同时支持加密和认证。从概念层面上来说,HTTP通常包括三部分:服务器端、发布端、客户端。
较为常用的 HLS 系统中,使用硬编码器将输入的音频编码为 AAC、将输入的视频编码为 h264,并将二者复用到 MPEG-TS 中,之后使用分片工具将其切分为一系列小的 TS 文件;这些文件将可以放到 web 服务器上。分片工具同时会创建并维护一个索引文件(HLS 中称为 M3U8),其中包含可用媒体文件的列表。索引文件的URL会在 web 服务器上发布。在开始一个流媒体会话时,客户端会下载一个包含元数据的extended M3U playlist文件(m3u8文件),用于寻找可用的媒体流。
如下是Apple公司官方的流程示意图:
m3u8
m3u8 文件本质说其实是采用了编码是 UTF-8 的 m3u 文件。至于m3u是什么,可以参考:m3u文件_百度百科
⼀个 m3u Playlist就是一个播放列表文件,⼀个由多个独⽴⾏组成的⽂本⽂件。每⼀⾏可以是⼀个URI、空⽩⾏或是⼀个以 “#” 号开头的字符串,并且空格只能存在于⼀⾏中不同元素间的分隔,每⾏由回⻋换⾏区分。⼀个 URI 表示⼀个媒体段或是 “variant Playlist file”(最多⽀持⼀层嵌套,即⼀个 m3u8 ⽂件中嵌套另⼀个 m3u8)
以 “#EXT” 开头的字符串表示是⼀个 tag,否则表示注释。
常见的tag如下:(暂做了解,后续用来回来查就行了)
m3u8与hls抓包分析
如下是一个m3u8文件的内容
#EXTM3U
#EXT-X-VERSION:5
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:6.0,
media_w570392994_b3128000_0.ts
#EXTINF:6.0,
media_w570392994_b3128000_1.ts
#EXTINF:6.0,
media_w570392994_b3128000_2.ts
#EXTINF:6.0,
media_w570392994_b3128000_3.ts
#EXTINF:6.0,
media_w570392994_b3128000_4.ts
#EXTINF:6.0,
media_w570392994_b3128000_5.ts
#EXT-X-ENDLIST
解析如下:
其中,上述直接表示播放列表内容的叫二级m3u8文件,还有一种叫做一级m3u8文件:
#EXTM3U
#EXT-X-VERSION:5
#EXT-X-STREAM-INF:BANDWIDTH=3128000,CODECS="avc1.4d001f,mp4a.40.2",RESOLUTION=1280x720
chunklist_w1690990834_b3128000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1778000,CODECS="avc1.4d001e,mp4a.40.2",RESOLUTION=852x480
chunklist_w1690990834_b1778000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1048000,CODECS="avc1.4d001e,mp4a.40.2",RESOLUTION=640x360
chunklist_w1690990834_b1048000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=738000,CODECS="avc1.4d0015,mp4a.40.2",RESOLUTION=428x240
chunklist_w1690990834_b738000.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=528000,CODECS="avc1.4d000d,mp4a.40.2",RESOLUTION=312x176
chunklist_w1690990834_b528000.m3u8
我们分析该 m3u8 文件:
一级m3u8文件一般用来存储二级m3u8的地址,二级m3u8文件用来保存播放列表。下图是一个简单概括的流媒体播放实现时序图,可以参考理解。
如下是srs-3.0环境下,HLS拉流的分析:
大致流程为,本地先到服务器拉取到m3u8文件,然后根据m3u8的的播放列表再不断的去服务器拿ts文件,如果当前m3u8的文件的播放列表读完了,就会再去服务器拿取/更新m3u8文件。
其中,m3u8文件中播放列表的ts文件,如果只有文件名,则表示是与当前m3u8文件同一路径下的。例如: