1、工作原理
HLS协议的工作原理是把整个流分成一个个小的基于HTTP的文件来下载,每次只下载一些。
2、简述
在服务器端,流媒体文件被切割成一个一个的小分片,这些小分片有着相同的时长(常用10s),每一个小分片是一个ts文件。同时 产生一个索引文件(m3u8),索引文件里存放了ts文件的URL。
客户端请求方式分两种,一种是点播(vod),一种是直播(live)
vod:客户端一次获取整个m3u8文件,按照里面的URL获取ts文件,采用HTTP协议。
live:由于M3u8文件时实时更新的,所以客户端每隔一段时间获取m3u8文件,再根据里面的URL获取ts文件,采用HTTP协议。
3、HLS的请求流程
4、索引文件(m3u8)格式
(1)主索引
#EXTM3U //每一个m3u8文件的第一句必须是这个tag,起标示作用
#EXT-X-VERSION:3 // 用于标示协议版本
#EXT-X-STREAM-INF : [attribute=value][,attribute=value]*
标签的属性列表中直接指明当前流是VIDEO还是AUDIO
属性 :
BANDWIDTH 指定码率
PROGRAM-ID 唯一ID (这个属性在后面的协议版本废除了)
CODECS 指定流的编码类型
#EXT-X-STREAM-INF:PROGRAM-ID=1,PUBLISHEDTIME=1462118775,CURRENTTIME=1462155858,BANDWIDTH=400000,RESOLUTION=854x480
30647_JIjP2_400/index.m3u8?Dnion_vsnae=30647_JIjP2
(2)子索引
#EXTM3U
#EXT-X-VERSION:3
// 每一个media URI 在 PlayList中只有唯一的序号,相邻之间序号+1
(上面那个URL, 不断请求的过程中能不断获取子索引, 每一次获取下来的都能发现EXT-X-MEDIA-SEQUENCE会不断增大)
#EXT-X-MEDIA-SEQUENCE:5647 //指明了出现在播放列表文件中的第一个URL的序列号
//每一份媒体文件的时间, 以秒为单位, 这里是10秒一份
#EXT-X-TARGETDURATION:10
//#EXTINF
// 每一份媒体文件的详细信息, duration : 媒体持续时间, 应该四舍五入为整数,上面的例子,9.560就是这一份媒体文件以秒为单位的持续时间
//title : 1462167932532_1462167932532.ts?Dnion_vsnae=30647_JIjP2这个是这一份媒体文件的URL地址,
#EXTINF:9.560,1462167932532_1462167932532.ts?Dnion_vsnae=30647_JIjP2
#EXTINF:6.520,1462167942133_1462167942133.ts?Dnion_vsnae=30647_JIjP2
#EXTINF:9.960,1462167948685_1462167948685.ts?Dnion_vsnae=30647_JIjP2
写清楚一点就是如下:
#EXTM3U m3u文件头
#EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
#EXT-X-TARGETDURATION 每个分片TS的最大的时长
#EXT-X-ALLOW-CACHE 是否允许cache
#EXT-X-ENDLIST m3u8文件结束符
#EXTINF 指定每个媒体段(ts)的持续时间(秒),仅对其后面的URI有效 mystream-12.ts