`
he91_com
  • 浏览: 377252 次
文章分类
社区版块
存档分类
最新评论

网络直播电视之M3U8解析篇(上)

 
阅读更多

最近单位要进行网络直播电视的开发工作,基本上在网上找不到相应的资料。但现在网络直播做出来了,做简要的讲解希望能给后来开发者提供一定的帮助。自己写的测试工具如下:

不论是点播还是直播,重要的部分不外乎都是数据源和数据播放两个方面。对于播放没什么特殊性,现在我针对直播的特殊地方,M3U8的解析进行说明。仅仅是个人见解。有不足的地方,望各位大牛们指出。

我们通过CCTV-3的网络直播地址进行分析http://t.live.cntv.cn/m3u8/cctv-3.m3u8。通过上个地址可以获得如下的内容:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000
http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8

其中EXT-X-STREAM-INF字段,说明了关于所属下载地址的相关信息。当然有些字段需要,有些字段不需要,重点看你的具体需求。而我主要利用了BANDWIDTH,一般我会取其中最高的一个。例如CCTV5中就包含了两个下载地址:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000
http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313735397C317C313030307C434354562D357C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv5.m3u8

#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=64000
http://220.181.168.111:80/interface/ipad/vid/63/ipad.m3u8

接下来我们通过CCTV3中提供的数据链接获取地址为例。http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8获取到一下内容:(郁闷了,得不到下一级内容了。数据都在单位内,只能用网上能找到的链接地址了。改天有时间再行替换。)

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:1356094361
#EXT-X-TARGETDURATION:10
#EXTINF:10,
cctv3_00_20121221201800.ts
#EXTINF:11,
cctv3_00_20121221201810.ts
#EXTINF:10,
cctv3_00_20121221201820.ts

其中#EXTINF:10, cctv3_00_20121221201800.ts,标记了一个TS下载片段和时长。我们还需注意就是#EXT-X-MEDIA-SEQUENCE:1356094361,这个字段标记了此M3U8下载的片段的序号。以上为了分别是1356094361,1356094362, 1356094363,相应序号。为了防止出现记录下载列表出现片段冲突的情况,最好在数据结构里定义序列号。我们通过频繁的刷新http://ipad.vsdn.tv380.com/5B63686E5D445830303030303034367C313635367C317C313030307C434354562D337C687474707C74735B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00/cctv3.m3u8片可以不间断的获取到实时TS片段的下载地址,并不断的将其存放在队列中。

注意以下下几点问题:

1、不要将片段在队列中冲突了。

2、一定要将#EXT-X-STREAM-INF字段进行解析过程和片段解析过程放到一起,因为有时服务器会突然更换下载片段M3U8地址。

3、注意一次m3u8获取到的片段个数,从而得到一次获取到的总的播放时长。进而安排好程序下次刷新的时间间隔。

4、一定要设定下载的超时时间,不能无限等待。拿不到的片段,果断丢弃。

5、片段序号总有一个时间点上会被归为0或1(不同的源不一样),提前处理做好准备。

暂时可以想到的就这些了,如果有疑问可以留言。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics