谈AS3搭档NGINX制作FLV视频播放器

为了升级之前开发播放器功能,想要实现视频制定时间跳转播放而又不通过流媒体服务器,所以开始研究NGINX与flash的交互,但是国内相关的博 客都是转来转去,搜出来的几乎全是一样,百分之百的教你怎么配置NGINX服务器和使用JW FLV Player,而对于AS3中怎样使用却无人提及,加之JW player的开源代码看起来比较恶心,所以决定研究flashAPI帮助文档和flv视频信息,最后后得到如下方法和心得,原理很简单:

传统的AS3播放flv的教程中对于快进的使用时NetStream.seek(播放时间)这个方法来实现的,其中参数里的播放时间需要在缓冲数据之内, 而NGINX号称支持关键帧开始播放,实际的原理就是HTTP访问时,服务器返回的flv文件时从该关键帧开始加上相应的头部信息来实现的。这里我们要注 意?start=xxxx中的xxxx一定要是flv视频信息中存在的帧才行,AS3中怎样获取flv视频的关键帧呢?

比如

PLAIN TEXT
ACTIONSCRIPT:
  1. this._nc = new NetConnection();
  2. this._nc.connect(null);
  3. this._ns = new NetStream(this._nc);
  4. var client:Object = new Object();
  5. client.onMetaData = onMetaData;
  6. this._ns.client = client;

这段代码中返回onMetaData的方法中可以获取

PLAIN TEXT
ACTIONSCRIPT:
  1. /**
  2. * 获取视频信息
  3. * @param    evt
  4. */
  5. private function onMetaData(evt:Object):void
  6. {
  7.            
  8.     this.totalMath.floor(evt.duration);
  9.     _model.VIDEO_INFO = evt.keyframes;
  10.     trace("总时长:"+this._total);
  11. }

其中evt.keyframes即位flv视频的关键帧信息,而判断flv视频文件是否有关键帧信息,则可以通过evt.hasKeyframes来判 断,该属性返回值为true和false。而evt.keyframes对象中包含两个属性信息filepositions和times,其中 filepositions是关键帧信息数组,times是相应关键帧对应的时间,下面是我获取某视频中关键帧信息样例:
evt.keyframes对象中times子对象的数据,标识关键帧对应的播放时间:

0,0,5.533,11.533,16.067,21.8,24.067,26.133,30,32.267,37.6,43.267,45.133,47.267,51.867,53.733,57.4,59.867,63.867,67.8,70.667,74.133,76.467,80,82.4,85.333,90.133,96.133,102.133,105.133,111.133,117.133,122.267,124.8,130.8,135.8,139.2,142.2,148.2,150,153.533,159.533,163.067,165.4,169.267,171.933,177.933,183.933,187.733,193.733,197.667,200.6,203.133,206.067,209.133,215.133,217.6,220.067,222.4,228.4,234.4,240.4,242.867,244.733,247.067,250.8,254.533,260.533,264.067,268.067,269.867,272,274.4,277.467,281.067,284.067,286.6,290.8,294.067,297.4,299.067,302.6,305.2,308.667,311.667,313.533,319.533,325.533,328.8,331.467,335.333,338,343,346.533,350.067,352.533,355.4,358.067,360.8,362.8,367.267,371.467,374.267,375.933,377.733,380.733,383.933,387.933,393.933,399.933,403.867,409.267,414.867,418.4

evt.keyframes对象中filepositions子对象的数据,标识关键帧,即我们上面所说的flv?start=xxxx中的xxxx的数据,如果xxxx的数字不再下面获取的flv关键帧中,则返回的数据文件格式错误,无法播放:

2650,2734,179170,362040,502095,687217,747251,813770,931890,1015804,1174764,1356682,1411927,1508559,1634406,1712758,1837296,1924593,2078091,2164183,2226333,2337820,2377968,2476248,2554368,2664586,2768775,2894230,3035847,3130652,3348618,3571268,3766343,3849311,4044788,4188396,4300083,4392539,4577497,4624653,4734492,4871226,4949224,5000486,5195382,5288821,5472473,5662645,5791675,5947651,6053179,6200560,6266445,6338100,6451014,6605875,6709343,6824559,6901223,7052468,7234868,7411185,7483760,7544164,7626147,7762197,7881221,8047468,8171763,8276937,8355123,8421664,8490698,8584352,8709950,8784877,8859630,8989008,9080175,9179022,9238318,9360639,9423169,9531208,9654510,9680621,9846348,10034265,10144692,10220895,10334161,10412023,10588244,10719901,10814462,10934765,10997771,11118320,11218603,11255080,11381747,11497686,11628573,11673477,11733196,11814608,11884327,11981067,12107692,12284393,12425526,12623196,12811502,12928943

有了这些关键帧信息,就可以再移动进度条时根据比例位置计算出该点最近的时间区间,然后获取相应关键帧,此时想要实现视频跳转播放用的就不是NetStream.seek这个方法了,而是NetStream.play(url?start=2650)这样的方式实现

posted @ 2013-10-10 21:32  Zimin  阅读(443)  评论(0)    收藏  举报