网络直播源PHP代理基础-M3U8粗谈

之前在某论坛(已经玩完)看到的一系列文章,挺有参考学习价值的,特别的去挖回来Study下..

原文

楼主由于长期在国外,想看国内电视就靠网络电视。尤其是安卓盒子,更加方便,不过由于网络原因,直播源靠自己测试编辑才稳定!以前只是搜集更大门户的不同直播源比较选择流畅的,但是这些源有的会反制,有的经常变化,所以只能靠自己逐渐摸索,学着写一些简单的代理。

看到最近很多朋友想学习写代理,其实论坛有很多前辈都贴出了很多教程,比如admin的教大家自己写简单的代理、absentfriend大大的继续发个cntv的超短proxy等等。楼主也是根据本坛前辈们的帖子,慢慢自己摸索出来的。幸运的是,楼主虽然不是码农科班出身,但为了工作需要,还是有很丰富的编程经验,所以上手还算顺利。现在能看到的趋势是,在行业逐渐规范的趋势下,版权意识更加深入人心,除了社会主义优越性决定的那些开放渠道,源肯定越来越难搞,楼主在将尽量把自己觉得有用的跟大家分享。当然,本坛里卧虎藏龙,高手云集,也希望前辈们多多指教,毕竟都是从小白过来的嘛

出于楼主对兼容性的偏爱,我们只谈有关m3u8格式的代理。整理一下思路,我们先了解一下关于m3u8的常识和基本格式,然后再通过举例教大家用php写简单的代理。

先简单介绍m3u8。根据IETF互联网工程任务组关于m3u8标准的说明,简单的说,m3u8就是一个播放列表。为了方便内容组织和用户体验,直播服务器的视频文件都会切成一段一段(比如每段10秒钟)。当用户想收看直播时,服务器就生成一个播放列表,列表里面有几段视频文件(比如3个片段),播放器把这些片段连起来播放就是这一段内容(10秒X3=30秒)的直播了。当然,直播一直在进行,一次得到的播放列表不可能涵盖以后所有的内容,所以每隔很短的一段时间(显然小于30秒),用户播放器就要重新向服务器请求新的列表,这样一来,就可以连续不断的直播下去了。我们举例说明,这是一个失效且经过涂改的CNTV的CCTV-NEWS直播m3u8文件范例(失效怎么了,我们只代理,不做CNTV的搬运工,学的是方法呀)

#EXTM3U
#EXT-X-MEDIA-SEQUENCE:1477958
#EXT-X-ALLOW-CACHE:YES
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:10.000,
http://koumen.live.cntv.cn/i/cctv9_1@139238/segment1477958_500_av-p.ts
#EXTINF:10.000,
http://koumen.live.cntv.cn/i/cctv9_1@139238/segment1477959_500_av-p.ts
#EXTINF:10.000,
http://koumen.live.cntv.cn/i/cctv9_1@139238/segment1477960_500_av-p.ts

第1行,这是所有m3u8文件都必须有的,说明我是一个播放列表。
第2行,说明我是第几个播放列表(比如过10s再跟服务器请求发列表,就会变成1477959)。
第3行,这个可以有,我跟你说你这个列表不许缓存,but who cares?
第4行,M3U版本,不重要。
第5行,说明下一次请求更新列表的时间是10s以后。
第6、8、10行,说明下面这个片段时长10s,
第7、9、11行,就是真正的一段段的视频了。
播放器获得列表之后,就会下载这三个视频,开始播放,然后在10s之后获得下一个列表,再下载列表里新出现的视频片段,如此往复,我们的直播就是这样进行的。这里需要说明的是,cntv是很规矩的,片段编号是连续的,而且每段的时间长度一样,所以其实挺容易写代理的,有些源的片段编号是随机的,就比较坏了。有的m3u8文件还会规定视频片段的加密方式之类的,不过这不在我们讨论范围之内了。

还有另外一种m3u8,用来做码流匹配,也就是根据用户的带宽情况,选择合适质量的视频。比如上面那个例子,其实有上一级的m3u8码流匹配列表,如下

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=169000,RESOLUTION=320x256
http://koumen.live.cntv.cn/i/cctv9_1@139238/index_200_av-p.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=453000,RESOLUTION=320x256
http://koumen.live.cntv.cn/i/cctv9_1@139238/index_500_av-p.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=511000,RESOLUTION=720x576
http://koumen.live.cntv.cn/i/cctv9_1@139238/index_850_av-p.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1216000,RESOLUTION=720x576
http://koumen.live.cntv.cn/i/cctv9_1@139238/index_1500_av-p.m3u8

这个列表的作用是说,我们服务器提供四种带宽的直播(当然,清晰度是不同的),请客户端根据网速情况选择。访问其中的第二个地址http://koumen.live.cntv.cn/i/cctv9_1@139238/index_500_av-p.m3u8,就会转到我们之前分析的那个含有视频片段的m3u8列表了。

关于m3u8的基础知识大概就是这样,你明白了吗?本文参考了部分网贴,比如CSDN的直播电视HLS协议分析及实现2—协议实例分析、流媒体开发之–HLS–M3U8解析(2): HLS草案等。

楼主妈妈喊楼主回家吃晚饭了,之后会持续更新,我们会讲到如何用php写简单的跳转代理,以及生成自己代理的m3u8列表等等。请大家持续follow,保证教会你写简单的代理,谢谢大家啦。

其他

分析的很到位,给了黑鸟君很大启发,我也不会PHP写直播源的代理,只是收藏着日后用..

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

  1. 云月 说道:

    请教一下,那里有比较全面一点的PHP代理直播写法的科谱知识。

  2. 火星五号趣闻 说道:

    好专业啊,学习get了,多谢分享