初始想法
最近看了一个优酷视频(非优酷网站,最终地址指向优酷),用chrome开发者工具,可找到flv地址如下,简单摘录如下:
http://27.221.100.104/657D4D2878C3382C78116A3BA7/0300011D10570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=200&ts_end=204&ts_seg_no=345&ts_keyframe=0
http://27.221.35.80/69810A0728A23382C6B5ABA374C/0300011D11570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=30&ts_end=40&ts_seg_no=349&ts_keyframe=0
http://27.221.35.80/69810A0728A23382C6B5ABA374C/0300011D11570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=40&ts_end=50&ts_seg_no=350&ts_keyframe=0
http://27.221.35.80/69810A0728A23382C6B5ABA374C/0300011D11570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=50&ts_end=60&ts_seg_no=351&ts_keyframe=0
http://27.221.100.83/65811F4F673C4C842B413F84911/0300011D17570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=70&ts_end=80&ts_seg_no=471&ts_keyframe=0
http://27.221.100.83/65811F4F673C4C842B413F84911/0300011D17570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=70&ts_end=80&ts_seg_no=471&ts_keyframe=0
http://182.118.58.54/698169CC4CB53C81CB279BF392A/0300011D1A570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts?ts_start=90&ts_end=100&ts_seg_no=533&ts_keyframe=0
可得出如下结果:
1. 每一地址下有单独一段flv,直接在网页中输入网址(截止flv.ts),可直接下载整个flv视屏。后边的ts_start/ts_end/ts_seg_no只是http申请一个数据帧。
http://182.118.58.54/698169CC4CB53C81CB279BF392A/0300011D1A570ECAA905BE2D9B7D2F338C9CFD-A474-20BA-9114-E91A51D93FA9.flv.ts
2. flv的名字有‘Dxx’决定,适配到另一IP不能找到文件。
3. 每段flv完成后,都会有一申请网页crossdomain.xml。
网页视频就是一个一个flv组成的,可通过网页直接下载单个flv,然后用软件组合成一个完整视频,以加快速度。
现在难点:
1. 怎样获取详细flv地址,以加以下载。
2. 查看到flv地址通过chrome开发工具,怎样通过数据包查看到数据内容呢?
注:网络上都提到“硕鼠”,但其仅支持大的视频网站,怎样能达到全部视频呢?
后思:怎样获取网页视频地址呢?
1. 直接从网页中提取网页视频地址,直接用浏览器文本查看可获取视频地址。
2. 若视频由多个下载地址组成,则只能下载一次视频,记录下所有地址,放到数据库中。当要获取地址时,直接从数据库中获取;若有变动,直接在云端下载视频测试,然后给出地址,此方法应该不常用,因为给出的地址即使无效也没有关系。
迅雷之所以下载快,是因为获取了视频的多个地址,然后保存到迅雷数据库中,当要下载时,开多个进程从多个地址下载,这个速度更快。之所以有些地址不能用,原因一地址无效(服务器地址主动改变,或迅雷服务器地址未更新)或地址主机已停机(下载当时)。我想这也是所有下载工具通用的方法:数据库记录可下载地址,匹配文件名或视频文件头找到地址,多进程从不同地址下载视频,然后合成视频。
视频格式及协议
视频直播有两个协议:RTMP和HLS。参考:流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
RTMP协议用于播放.flv视频,adobe开发。参考:RTMP流媒体播放过程
HLS协议HTTP Live Streaming用于播放.ts视频,apple开发。关键组成有m3u8和多个视频分片.ts,其中m3u8指定视频分片的地址。参考:
跨域问题
上面提到文件crossdomain.xml是跨域策略文件。Web站点通过crossdomain.xml文件配置提供允许的域跨域访问本域内容的权限。是adobe flashplayer的运行策略。
这是Flash安全沙盒机制:在Flash跨域访问时——比如www.ddonwi.com/loader.swf文件要加载hi.ddonwi.com/beauty1.swf文件,就属于跨域(名)访问——Flash要求通过如下的策略来确定信任关系:
1、被访问域名下的crossdomain.xml文件
以之前提的例子为例:loader.swf文件要加载beauty1.swf文件时,会先拉取hi.ddonwi.com/crossdomain.xml文件,这个文件里会列出允许访问的域名,比如hi.ddonwi.com/crossdomain.xml文件的格式可能如下:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="www.ddonwi.com" />
</cross-domain-policy>
它说明了www.ddonwi.com是可信任的域名。
如果访问者的域名不在再被访者的crossdomain.xml的信任名单内,Flash就不会去加载文件。
2、不仅如此,Flash还有进一步的保护措施,被拉取的swf文件中还需要调用Security.allowInsecureDomain()声明允许的访问者的域名。如果被访者没有写这个信任策略,swf文件可以被下载,但不能被执行。