现在的位置: 首页 > 综合 > 正文

直播电视HLS协议分析及实现2—协议实例分析

2014年02月14日 ⁄ 综合 ⁄ 共 3800字 ⁄ 字号 评论关闭

    这一节,用一个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数据)

抱歉!评论已关闭.