BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / flash / #39765同步于 2008/12/1
Flash机器人发帖

优酷为什么快--源码分析报告

sm4llb0y
2008/12/1镜像同步0 回复
由于每次项目组开会,总是讨论为什么优酷这么快,有些人怀疑用的p2p等等~,所以小人下载优酷的播放器反编译之后对源码进行了不太彻底的分析,现报告如下: 经分析发现: 1.没有发现播放器收集用户信息上报服务器的痕迹,故不可能完成P2P的检索等等; 2.没有发现使用AS3里边的socket等类,仅仅采用NetConnection和NetStream,故P2P一说更是不可能; 3.对其中的VideoController进行详细分析(播放器的核心类),发现一下代码 var _local2 = _root2.video_mc.mc.duplicateMovieClip("mc" + _local3, 1000 - _local3); mc_array.push(_local2); var _local5 = fileid.slice(0, 8); var _local6 = _local3; var _local4 = _local6.toString(16); if (_local4.length == 1) { _local4 = "0" + _local4; } _local4 = _local4.toUpperCase(); var _local7 = fileid.slice(10, fileid.length); if (maxiii > 1) { _local2.fileid = (_local5 + _local4) + _local7; _local2.flvURL = (((((("http://f.youku.com/player/getFlvPath/sid/" + _root2.ReportSID) + "_") + _local4) + "/st/") + stp_yxb) + "/fileid/") + _local2.fileid; } else { _local2.fileid = fileid; _local2.flvURL = ((((("http://f.youku.com/player/getFlvPath/sid/" + _root2.ReportSID) + "_00") + "/st/") + stp_yxb) + "/fileid/") + _local2.fileid; } _local2.starttime = 0; _local2.loadflag = 0; _local2.iii = _local3; _local2.nc = new NetConnection(); _local2.nc.connect(null); _local2.ns = new NetStream(_local2.nc); _local2.ns.setBufferTime(2); _local2.video.attachVideo(_local2.ns); _local2.video.smoothing = true; _local2.gotime = -1; _local2.oldbytesTotal = 0; _local2.video.attachAudio(_local2.ns); _local2.sou = new Sound(_local2.video); _local2.sou.setVolume(0); _local2.ns.name1 = _local2; _local2.ns.i = _local3; 还有许多,牵扯一些问题,不再贴了,优酷的做法是复制出大量的mc,而且视频进行了切分(为什么你用flv下载器下载的时候总是只下载到一块呢?就是这个原因),然后由不同的mc来下载不同段的flv或者mp4进行缓存然后pause,这块下载到暂停的使显示是依靠down函数做到的: function down(i, t) { if (t > (time_array[i] - 15)) { t = time_array[i] - 15; } t = int(t); if (stp_yxb == "mp4") { mc_array[i].dragtime = t; } else { mc_array[i].dragtime = 0; } mc_array[i].starttime = t; downI = i; mc_array[i].loadflag = 1; mc_array[i].t = t; mc_array[i].gotime = t; mc_array[i].firstime = undefined; mc_array[i].firstiii = undefined; mc_array[i].loadtimea = undefined; mc_array[i].oldbytesTotal = 0; if (t != 0) { mc_array[i].ns.play(((((mc_array[i].flvURL + "?start=") + t) + "&K=") + _root2.key2) + _root2.key1); } else { mc_array[i].ns.play((((mc_array[i].flvURL + "?") + "K=") + _root2.key2) + _root2.key1); } _root2.ctt = _root2.ctt + (((((mc_array[i].flvURL + "?start=") + t) + "&K=") + _root2.key2) + _root2.key1); waitttt = 0; mc_array[i].sou.setVolume(0); mc_array[i].ns.pause(true); } 到需要播放的时候swap一下mc,然后调用NetStream的play进行播放~~,大体原理是这样的~~ 实际上个人觉着还有好多地方可以进行优化比如说切块的大小,一般用户可能觉着点开一个视频,刷的一下就下载一小块就很快,但是如果整个一大块进行下载就会相对来说很慢(可以考虑对首块的大小进行适当的切分等等)。 总之的个人觉着优酷快,可能不知播放器里边的秘密,很可能跟CDN提供商也有合作等等等等~~。 报告完毕~~~ 不过优酷最近正在搞p2p的插件倒是真的~~~
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。