网络直播电视之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(不同的源不一样),提前处理做好准备。
我遇见到的不同数据源的M3U8文件进行列举和分析。
第一种:ts片段地址为文件名称,下载地址为:

http:\\www.XXX.com\01\XX\1.m3u8

#EXTM3U  
#EXT-X-TARGETDURATION:8  
#EXT-X-MEDIA-SEQUENCE:92595  
#EXTINF:8,  
20121120T182851-04-92595.ts  
#EXTINF:8,  
20121120T182851-04-92596.ts  
#EXTINF:8,  
20121120T182851-04-92597.ts  
#EXTINF:8,  
20121120T182851-04-92598.ts  
#EXTINF:8,  
20121120T182851-04-92599.ts  
#EXTINF:8,  
20121120T182851-04-92600.ts  
#EXTINF:8,  
20121120T182851-04-92601.ts  
#EXTINF:8,  
20121120T182851-04-92602.ts  

那么获取到 20121120T182851-04-92595.ts 片段地址就为
http:\www.XXX.com\01\XX\20121120T182851-04-92595.ts。
类似情况,如下:

#EXTM3U 
#EXT-X-ALLOW-CACHE:NO 

#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:6198 
#EXTINF:3, aac749f7425bf07f_13b4b0fd1b7_6198.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com 
#EXTINF:3, aac749f7425bf07f_13b4b0fe1b8_6199.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com #EXTINF:3, aac749f7425bf07f_13b4b0ffa08_6200.ts?wsApp=HLS&wsMonitor=-1&wsHost=rtmp.cntv.lxdns.com  

第二种:ts片段地址为目录结构,下载地址为:

http:\\www.XXX.com\01\XX\1.m3u8。

#EXTM3U  
#EXT-X-ALLOW-CACHE:NO  
#EXT-X-TARGETDURATION:10  
#EXT-X-MEDIA-SEQUENCE:9190381  
#EXTINF:10,  
/timeshift/63/20121129165010.ts  
#EXTINF:10,  
/timeshift/63/20121129165020.ts  
#EXTINF:10,  
/timeshift/63/20121129165030.ts  

那么获取到/timeshift/63/20121129165010.ts片段地址就为
http:\www.XXX.com\01\XX/timeshift/63/20121129165010.ts。

第三种:ts片段地址为目录结构,但是和m3u8下载地址目录重叠。下载地址为:http:\www.XXX.com\01\timeshift\63\1.m3u8。

#EXTM3U  
#EXT-X-ALLOW-CACHE:NO  
#EXT-X-TARGETDURATION:10  
#EXT-X-MEDIA-SEQUENCE:9190381  
#EXTINF:10,  
/timeshift/63/20121129165010.ts  
#EXTINF:10,  
/timeshift/63/20121129165020.ts  
#EXTINF:10,  
/timeshift/63/20121129165030.ts  

将冲突的目录剔除,那么获取到/timeshift/63/20121129165010.ts片段地址就为http:\www.XXX.com\01\XX/timeshift/63/20121129165010.ts。

第四种:ts片段地址为完整的片段下载地址,下载地址为:

http:\\www.XXX.com\01\XX\1.m3u8

#EXTM3U  
#EXT-X-ALLOW-CACHE:NO  
#EXT-X-TARGETDURATION:10  
#EXT-X-MEDIA-SEQUENCE:6297202  
#EXTINF:10,  
http://202.108.17.170:80/ipad/160_12784_1758/20121127185340.ts?userid=2221281760225887_160_12784_1758  
#EXTINF:10,  
http://202.108.17.170:80/ipad/160_12784_1758/20121127185350.ts?userid=2221281760225887_160_12784_1758  
#EXTINF:10,  
http://202.108.17.170:80/ipad/160_12784_1758/20121127185400.ts?userid=2221281760225887_160_12784_1758  

这种情况下下载地址就不需要拼接了。
直播不同的数据得到的片段下载地址也就基本维持这四种情况,当然林子大了什么鸟都有。也说不定会碰见更奇特的呢。呵呵…

总结:
1. http”开头的一定是全下载地址,不需要进行拼接处理的。有些“二杆子源”,会将写成“HTTP”或“Http”等等。所以我们需要先转成小写在进行匹配,当然下载地址的http还需为小写。
2. 带有目录结构的源,同样有些或是这样的“timeshift/63/2012129165020.ts”,前面不带“/”。注意哦!

猜你喜欢

转载自blog.csdn.net/cnhome/article/details/73251029