`
yangdc
  • 浏览: 86902 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

视频网站地址获取原理

阅读更多
视频网站通用的播放原理比较简单:
打开页面首先load一个播放器,然后播放器根据一定的条件向后台请求flv文件并播放。

youku网防止用户下载的几个措施
1 动态创建flv播放器,防止用查看源代码的方式分析其播放器。
2 flv文件分割,将一个较长的文件分割成每段大约为7分钟的几段,其地址不同,甚至有可能在不同的服务器上。
3 动态生成flv文件地址,并且地址有时间限制,过时失效。

这是我目前所知最为费尽心思的加密方式,这方面比tudou作的好。

典型的youku播放地址是这样的:
http://v.youku.com/v_show/id_XMTgzMTg1ODQ=.html
大体上这个页面应该是不存在的,youku应该有一个类似SessionFilter的东西对这些请求地址进行过滤并动态生成页面,当然由于效率原因可能对一些请求频率高的页面进行缓存,这都不在我们讨论范围之内,这里重点是,如果我们的猜想是正确的,youku必然是通过这个地址地址来决定播放的视频,我们应该能够看出 ‘id_XMTgzMTg1ODQ=’这一段应该是与这个视频的id相关的。也就是说,youku应该对每个视频有一个唯一的id,可以通过这个id来找到对应的视频。
不过地址中的这个id是加密的,在页面源文件中搜索:XMTgzMTg1ODQ=
可以找到:
var videoId = '4579646';
var videoId2= 'XMTgzMTg1ODQ=';

我们找到了加密前后的videoid。

我们前面说的播放器通用的播放原理的youku版就是:

1 输入地址
2 根据地址生成页面,load播放器,并且获得播放文件id
3 将id传给播放器,播放器根据视频id获取视频地址。我们前面说的youku视频已被分割,所以这里获取的应该是该视频对应的列表地址。


下面要做的工作是分析flv播放器如何根据id来找到视频的:
使用firebug分析页面,
有这样一个请求:
http://v.youku.com/player/getPlayList/VideoIDS/4579646/version/5/source/video/password/?ran=8639&n=3
这是典型的REST架构阿,其 response如下:
{"data":[{"tt":"0","ct":"c","cs":"2043|2053","logo":"http:\/\/vimg15.youku.com\/11270F1F4647B1CFAEC63F0051AE550CE7D610-8E8B-4C0D-58CB-D44E6653E344"

,"seed":9054,"tags":["\u5927\u72ec\u88c1\u8005","\u6b27\u7f8e\u7535\u5f71","\u5353\u522b\u6797"],"categories"

:"96","streamsizes":{"flv":"291427815"},"streamfileids":{"flv":"56*14*14*7*56*15*1*8*56*56*13*7*64*1

*50*15*57*54*14*64*15*16*56*56*54*1*46*16*54*54*7*16*54*64*56*14*8*61*40*9*7*56*13*40*14*61*64*15*40

*9*10*15*57*40*50*7*10*1*50*46*64*61*56*16*61*14*"},"videoid":"4579646","segs":{"flv":[{"no":"0","size"

:"12756561","seconds":"395"},{"no":"1","size":"12588606","seconds":"396"},{"no":"2","size":"12575477"

,"seconds":"395"},{"no":"3","size":"12589273","seconds":"395"},{"no":"4","size":"12426491","seconds"

:"395"},{"no":"5","size":"12543093","seconds":"395"},{"no":"6","size":"12419380","seconds":"395"},{"no"

:"7","size":"12642058","seconds":"395"},{"no":"8","size":"12560630","seconds":"395"},{"no":"9","size"

:"12754471","seconds":"396"},{"no":"10","size":"12345040","seconds":"395"},{"no":"11","size":"12642647"

,"seconds":"395"},{"no":"12","size":"12685996","seconds":"395"},{"no":"13","size":"12678854","seconds"

:"395"},{"no":"14","size":"12562234","seconds":"395"},{"no":"15","size":"12537914","seconds":"395"},

{"no":"16","size":"12685755","seconds":"395"},{"no":"17","size":"12371695","seconds":"396"},{"no":"18"

,"size":"11860130","seconds":"395"},{"no":"19","size":"13183528","seconds":"394"},{"no":"20","size":"11896514"

,"seconds":"394"},{"no":"21","size":"11055722","seconds":"394"},{"no":"22","size":"12370008","seconds"

:"393"},{"no":"23","size":"5036383","seconds":"171"}]},"fileid":"56*14*14*7*56*15*1*8*56*56*13*7*64*1

*50*15*57*54*14*64*15*16*56*56*54*1*46*16*54*54*7*16*54*64*56*14*8*61*40*9*7*56*13*40*14*61*64*15*40

*9*10*15*57*40*50*7*10*1*50*46*64*61*56*16*61*14*","username":"pk\u6b27\u7f8e\u7535\u5f71","userid":"5353045"

,"title":"\u5927\u72ec\u88c1\u8005","key1":"bd7ed169","key2":"2f67ce4b4901bd2f","seconds":"9271.00","streamtypes"

:["flv"]}],"user":{"id":0}}


这是个JSON对象,指明了播放列表的相关信息。

streamsizes 指明该视频总的大小。
segs对象指明了该视频被分成了22个视频段落,以及每个视频的长度和大小。

与视频地址相关的重要变量为seed,fileid,key1和key2。我们下面细说。

先说下一个请求
http://f.youku.com/player/getFlvPath/sid/122873056861916199103_00/st/flv/fileid/02270F180047B1CF952BFE0051AE557E5B0286-3704-26BF-3DF9-C7D1CAB60E62?K=b4cf663c8307abcb14f9fc6

点击这个链接,浏览器会返回给你一个flv文件,这就是我们需要的文件,那么这个请求地址是如何构造得到的呢?
你点击这个链接可能会提示页面不存在,这是youku的地址时效机制起作用--这个地址已经超时啦。





分享到:
评论
3 楼 string2020 2014-05-10  
好,谢谢。
楼主能不能帮忙分析一下
http://class.baihe.com/index.php?play&vid=256
这个网站的视频下载地址

谢谢
2 楼 tianhandigeng 2013-07-06  
打开页面首先load一个播放器 这个是怎么load的 这个load的播放器在哪 ?
1 楼 千山我独行 2008-12-23  
我也很想知道~

相关推荐

    OpenCV从视频文件中获取图像

    OpenCV从视频获取图像集,注意在项目下创建Images文件夹,用于保存获取到的图像

    (摄像头的工作原理(获取视频数据))摄像头视频采集压缩及传输.docx

    (摄像头的工作原理(获取视频数据))摄像头视频采集压缩及传输.docx(摄像头的工作原理(获取视频数据))摄像头视频采集压缩及传输.docx(摄像头的工作原理(获取视频数据))摄像头视频采集压缩及传输.docx(摄像头的工作原理...

    C#获取视频某一帧的缩略图的方法

    原理是通过ffmpeg执行一条命令获取视频某一帧的缩略图。 首先,需要获取视频的帧高度和帧宽度,这样获取的缩略图才不会变形。 获取视频的帧高度和帧宽度可以参考://www.jb51.net/article/57475.htm。 获取到视频的...

    Android使用MediaCodeC与OpenGL硬解码 录制mp4音视频实现源码

    将Camera数据显示到OpenGL ES渲染的图像中,并通过MediaCodeC 将 OpenGL ES 缓冲数据,硬编码写入到 mp4 视频文件中,完成视频的录制。 文件介绍请见: https://xiaxl.blog.csdn.net/article/details/72530314 ...

    视频信息处理技术.pptx

    视频信息压缩基本原理 3.数字视频文件格式 4.视频信息处理方法 5.用 Windows Live影音制作对视频信息进行处理 视频信息处理技术全文共16页,当前为第2页。 1视频信息的获取 --------- 模拟视频信号 ------ 数字视频...

    嗅探的基本原理嗅探的基本原理

    SNIFF真是一个古老的话题,关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFF究竟是什么呢?SNIFF就是嗅探器,就是窃听器,SNIFF静悄悄的工作在网络的底层,把你的秘密...

    通用Mapper原理视频讲解

    2.首先获取接口泛型的实际对象类型 3.根据JPA注解,初始化实体类和表的信息 4.具体实现方法,根据当前方法操作,使用实体类信息拼xml形式的SQL语句 5.使用MyBatis的XMLLanguageDriver,根据xml形式SQL语句生成Sql...

    camera录制视频的缩略图获取原理心得分享

    camera录制的视频的缩略图如何获取,想必有很多的朋友都不会吧,下面与大家分享下获取的原理,感兴趣的你可不要错过了哈

    获取视频时长-易语言

    这个是获取mp4视频时长的,通过解析MP4文件来获取的,其他格式的视频与这个原理应该是一样的,只要知道视频时长所在的位置即可!

    易语言-易语言获取本地MP4视频文件时长

    易语言获取本地MP4视频文件时长源码,源码调用了精易模块6.31,这个源码是获取mp4视频时长的,通过解析MP4文件来获取的,其他格式的视频与这个原理应该是一样的,只要知道视频时长所在的位置即可!

    PHP100视频教程全集112集BT种子【PHP经典】

    PHP100视频教程13:PHP+MYSQL分页原理 PHP100视频教程14:PHP上传原理及应用 PHP100视频教程15:PHP生成HTML文件原理 PHP100视频教程16:PHP小偷程序原理和实例 PHP100视频教程17:PHP面向对象开发的学习(一) ...

    全面讲解百度地图原理与应用视频课程

    视频详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 使用场景: 地图的使用场景非常广泛。地图定位可以更直观的说明位置及周边环境,让用户更好的了解地理位置信息,更好的规划路径,以方便出行。...

    从MPEG2 TS流中提取视频序列流

    该程序能够从输入的MPEG2 传送...其中包括将TS流拆包得到视频原始流(PES),再把视频PES流拆去包头,去掉填充字节等最后得到视频序列流。提取得到的视频序列流可以用作转码,关键帧提取等与MPEG2相关的视频编辑和处理。

    基于 opencv 将视频转化为字符串 Java 版 附完整项目代码数据 可直接运行

    我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化,变成字符串,然后进行打印。 1.获取视频 在 opencv 中提供了一个 函数 去获取视频 VideoCapture capture = new ...

    Visual C++音频视频处理技术及工程实践地址

    主要内容包括软件Visual C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642 DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地...

    深度强化学习 ( DQN )基本原理与AI项目实战 教学视频 代码资料

    在强化学习的世界里, 算法称之为Agent, 它与环境发生交互,Agent从环境中获取状态(state),并决定自己要做出的动作(action).环境会根据自身的逻辑给Agent予以奖励(reward)。奖励有正向和反向之分。比如在...

    基于Socket的Android手机视频实时传输

    首先,简单介绍一下原理。主要是在手机客户端(Android)通过实现Camera.PreviewCallback接口,在其onPreviewFrame重载函数里面获取摄像头当前图像数据,然后通过Socket将图像数据和相关的用户名、命令等数据传输到...

    基于stm32的两轮自平衡小车2(原理篇)

    六轴传感器获取角度 参考资料 这里有一些博主收集资料过程中发现的好东西,分享一波: 正点原子手把手教你学STM32-M3(视频) 一天攻克平衡小车(视频) 两轮平衡小车开源资料(原理图、PCB、程序源码、BOM等) 基于...

    MS15-034 HTTP.sys远程执行代码漏洞(原理扫描)

    目前厂商已经发布了升级补丁以修复此安全问题,补丁获取链接: https://docs.microsoft.com/zh-cn/security-updates/securitybulletins/2015/ms15-034 如果在一台Windows Server 2012 R2的服务器上直接安装补丁...

Global site tag (gtag.js) - Google Analytics