Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538178
  • 博文数量: 86
  • 博客积分: 1076
  • 博客等级: 准尉
  • 技术积分: 1018
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-02 19:15
文章分类

全部博文(86)

文章存档

2013年(15)

2012年(69)

2011年(2)

分类: Android平台

2013-04-17 20:24:18

    这一节,用一个HLS的直播地址在浏览器中做一个测试,对HLS协议有个直观的了解。
    地址[某个地方电视台]:http://tsl2.hls.cutv.com/cutvChannelLive/2YeHjQB.m3u8

    将这个网址复制到浏览器地址栏,回车,得到下面的variant列表,有不同的带宽(根据浏览器不同,有的是浏览器直接显示,有的是下载下来的m3u8的文件,可以用ultraEdit打开,同时,我这里讲的是一个通常情况,后面会提到有些m3u8的地址不会返回variants列表)
    
  1. #EXTM3U
  2. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=350000
  3. http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_sd.m3u8
  4. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
  5. http://tsl2.hls.cutv.com/cutvlive/2YeHjQB/hls/live_l.m3u8
  6. #EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000
  7. 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(注意:由于是直播,时间段的不同,返回的列表会不同)
    
  1. #EXTM3U
  2. #EXT-X-MEDIA-SEQUENCE:25204
  3. #EXT-X-ALLOW-CACHE:NO
  4. #EXT-X-VERSION:2
  5. #EXT-X-TARGETDURATION:8
  6. #EXTINF:8,
  7. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25204.ts
  8. #EXTINF:8,
  9. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25205.ts
  10. #EXTINF:8,
  11. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25206.ts
  12. #EXTINF:8,
  13. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25207.ts
  14. #EXTINF:8,
  15. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25208.ts
  16. #EXTINF:8,
  17. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25209.ts
    这里就是前一节文章提到的每一个小段的数据流的地址。简单介绍一下语法
    
  1. #EXTM3U m3u文件头,必须放在第一行
  2. #EXT-X-MEDIA-SEQUENCE 第一个TS分片的序列号
  3. #EXT-X-TARGETDURATION 每个分片TS的最大的时长
  4. #EXT-X-ALLOW-CACHE 是否允许cache
  5. #EXT-X-ENDLIST m3u8文件结束符
  6. #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】,你会得到
    
  1. #EXTM3U
  2. #EXT-X-MEDIA-SEQUENCE:25341
  3. #EXT-X-ALLOW-CACHE:NO
  4. #EXT-X-VERSION:2
  5. #EXT-X-TARGETDURATION:8
  6. #EXTINF:8,
  7. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25341.ts
  8. #EXTINF:8,
  9. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25342.ts
  10. #EXTINF:8,
  11. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25343.ts
  12. #EXTINF:8,
  13. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25344.ts
  14. #EXTINF:8,
  15. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25345.ts
  16. #EXTINF:8,
  17. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25346.ts
    (因为间隔上一次时间较长了,我们接着再请求一次)

  1. #EXTM3U
  2. #EXT-X-MEDIA-SEQUENCE:25352
  3. #EXT-X-ALLOW-CACHE:NO
  4. #EXT-X-VERSION:2
  5. #EXT-X-TARGETDURATION:8
  6. #EXTINF:8,
  7. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25352.ts
  8. #EXTINF:8,
  9. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25353.ts
  10. #EXTINF:8,
  11. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25354.ts
  12. #EXTINF:8,
  13. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25355.ts
  14. #EXTINF:8,
  15. ../../../cutvlive/streams/events/2YeHjQB/hls/live_sdNum25356.ts
  16. #EXTINF:8,
  17. ../../../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) |
给主人留下些什么吧!~~