这一节,用一个HLS的直播地址在浏览器中做一个测试,对HLS协议有个直观的了解。
地址[某个地方电视台]:http://tsl2.hls.cutv.com/cutvChannelLive/2YeHjQB.m3u8
将这个网址复制到浏览器地址栏,回车,得到下面的variant列表,有不同的带宽(根据浏览器不同,有的是浏览器直接显示,有的是下载下来的m3u8的文件,可以用ultraEdit打开,同时,我这里讲的是一个通常情况,后面会提到有些m3u8的地址不会返回variants列表)
-
#EXTM3U
-
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=350000
-
http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8
-
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
-
http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_l.m3u8
-
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000
-
http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_a.m3u8
上面返回的是HLS的称为variant的列表,这里面主要提供了各种不同带宽下的URL链接,也就是BANDWIDTH字段的数值,例如35000就是35kB每秒了,这个具体选择什么由客户端根据网络状况自由选择。下面以第一个带宽为例继续。
再在地址栏输入http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8,会得到以下的播放列表segments(注意:由于是直播,时间段的不同,返回的列表会不同)
-
#EXTM3U
-
#EXT-X-MEDIA-SEQUENCE:25204
-
#EXT-X-ALLOW-CACHE:NO
-
#EXT-X-VERSION:2
-
#EXT-X-TARGETDURATION:8
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25204.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25205.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25206.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25207.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25208.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25209.ts
这里就是前一节文章提到的每一个小段的数据流的地址。简单介绍一下语法
-
#EXTM3U m3u文件头,必须放在第一行
-
#EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
-
#EXT-X-TARGETDURATION 每个分片TS的最大的时长
-
#EXT-X-ALLOW-CACHE 是否允许cache
-
#EXT-X-ENDLIST m3u8文件结束符
-
#EXTINF extra info,分片TS的信息,如时长,带宽等
对照上面返回的列表分析:
(1)#EXT-X-MEDIA-SEQUENCE:25204 这个就是这张表里面的第一个数据段地址[../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25204.ts]的序列号,下面的依次递增。那么他的作用是什么呢?
上一节我们提到,这个列表是要不断去请求的(可以以一定的算法来计算请求间隔),也就是如果我们这时候再去请求一次【http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8】,你会得到
-
#EXTM3U
-
#EXT-X-MEDIA-SEQUENCE:25341
-
#EXT-X-ALLOW-CACHE:NO
-
#EXT-X-VERSION:2
-
#EXT-X-TARGETDURATION:8
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25341.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25342.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25343.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25344.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25345.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25346.ts
(因为间隔上一次时间较长了,我们接着再请求一次)
-
#EXTM3U
-
#EXT-X-MEDIA-SEQUENCE:25352
-
#EXT-X-ALLOW-CACHE:NO
-
#EXT-X-VERSION:2
-
#EXT-X-TARGETDURATION:8
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25352.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25353.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25354.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25355.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25356.ts
-
#EXTINF:8,
-
../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25357.ts
你会看到这个列表每一段的地址是有重复的,也就是序列号从25351->25352,也就是服务器端更新了一段数据了,直播嘛,当然数据要不断去更新。
(2)#EXT-X-TARGETDURATION:8 这是说每一段数据的长度最长是8s
(3)../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25352.ts 这个自然就是最主要的数据的地址了,输入到地址栏会得到一个ts格式的视频,但是这里要注意一点,这个地址是一个相对地址,关于相对地址的拼接有专门的规则,这里先不讲,告诉方法,就是拼接所用的variant地址【http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8】,因为segment的地址最前面没有“/",所以拼接在最后一个"/"后面的,也就是说实际的地址为
http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25352.ts
输入到地址栏就会得到数据了,可以用播放器打开。(也有一个注意点,因为是直播,有些服务器保留的数据时间不会太长,一般30s左右就没有了,意味着segment的表要足够新,不然数据就过期了)。这个数据流一般是H264编码的视频、AAC编码的音频。
(4)如果你在8s的最长间隔内再请求一次http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8,就会又得到一张segments播放列表,根据前面提到的序列号,比如前一次下载了25352的数据段,那么自然下一个就是25353了。如此持续下去,就可以得到连续的直播电视流了。
补充:由于HLS协议比较宽泛,不同的服务器商的HLS地址会有一些区别,后续文章会陆续提及。(下一节提提怎么设计程序框架,得到连续的HLS数据)
阅读(3666) | 评论(0) | 转发(0) |