最近网络不稳定,网络电视剧看到一半突然网络掉线,这以后就是网络好了,发现播放器提示我视频已经播放结束,跳到下一集去播放了,其实上一集没有没有真正的看完。
经过分析后:
NetStream.Play请求到流后,如果没有数据发送过来,就会发生NetStream.Play.Stop事件,所以提示说视频播放结束。
例如在关键帧33304发生NetStream.Play.Stop
动手编写测试代码:
function NetStatusHandler(e:*):void { if (e.info.code=="NetStream.Play.Stop") { ns.close(); ns.play("http://222.73.110.88/ce72bc24d64a3afbffc91691881afcd5/vodflv/%E7%94%B5%E5%BD%B1/091229-350k-%E6%9A%AE%E5%85%89%E4%B9%8B%E5%9F%8E-2.flv?start=33304&end=12604683"); } } function onDataHandler(ee:Object):void {} var nc:NetConnection=new NetConnection(); nc.connect(null); var ns:NetStream=new NetStream(nc); ns.play("http://222.73.110.88/ce72bc24d64a3afbffc91691881afcd5/vodflv/%E7%94%B5%E5%BD%B1/091229-350k-%E6%9A%AE%E5%85%89%E4%B9%8B%E5%9F%8E-2.flv?start=0&end=12604683"); var myobj:Object = new Object(); myobj.onMetaData = onDataHandler; ns.client = myobj; var v:Video=new Video(640,440); ns.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler); v.attachNetStream(ns); addChild(v);
结果在FLASH IDE中测试 偶尔FLASH挂了,在IE中测试挂了概率也非常的高。或者就没有任何反应。
最后想起了NetStream.Seek 一个MP4(H264)文件的BUG联想到。使用延时播放。
修改最后代码:
function NetStatusHandler(e:*):void { if (e.info.code=="NetStream.Play.Stop") { ns.close(); var sleepTime:Timer = new Timer(200); if (!sleepTime.hasEventListener(TimerEvent.TIMER)) { sleepTime.addEventListener(TimerEvent.TIMER,SleepHandler); } sleepTime.running||sleepTime.start(); function SleepHandler(e:TimerEvent):void { sleepTime.running&&sleepTime.stop(); sleepTime.removeEventListener(TimerEvent.TIMER, SleepHandler); ns.play("http://222.73.110.88/ce72bc24d64a3afbffc91691881afcd5/vodflv/%E7%94%B5%E5%BD%B1/091229-350k-%E6%9A%AE%E5%85%89%E4%B9%8B%E5%9F%8E-2.flv?start=33304&end=12604683"); } } } function onDataHandler(ee:Object):void {} var nc:NetConnection=new NetConnection(); nc.connect(null); var ns:NetStream=new NetStream(nc); ns.play("http://222.73.110.88/ce72bc24d64a3afbffc91691881afcd5/vodflv/%E7%94%B5%E5%BD%B1/091229-350k-%E6%9A%AE%E5%85%89%E4%B9%8B%E5%9F%8E-2.flv?start=0&end=12604683"); var myobj:Object = new Object(); myobj.onMetaData = onDataHandler; ns.client = myobj; var v:Video=new Video(640,440); ns.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler); v.attachNetStream(ns); addChild(v);