使用NetStream.Play诡异

最近网络不稳定,网络电视剧看到一半突然网络掉线,这以后就是网络好了,发现播放器提示我视频已经播放结束,跳到下一集去播放了,其实上一集没有没有真正的看完。

经过分析后:

NetStream.Play请求到流后,如果没有数据发送过来,就会发生NetStream.Play.Stop事件,所以提示说视频播放结束。

 

例如在关键帧33304发生NetStream.Play.Stop

动手编写测试代码:

01 function NetStatusHandler(e:*):void {
02     if (e.info.code=="NetStream.Play.Stop") {
03         ns.close();
05     }
06 }
07 function onDataHandler(ee:Object):void {}
08 var nc:NetConnection=new NetConnection();
09 nc.connect(null);
10 var ns:NetStream=new NetStream(nc);
12 var myobj:Object = new Object();
13 myobj.onMetaData = onDataHandler;
14 ns.client = myobj;
15 var v:Video=new Video(640,440);
16 ns.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
17 v.attachNetStream(ns);
18 addChild(v);

结果在FLASH IDE中测试 偶尔FLASH挂了,在IE中测试挂了概率也非常的高。或者就没有任何反应。

 

最后想起了NetStream.Seek 一个MP4(H264)文件的BUG联想到。使用延时播放。

修改最后代码:

 

 

01 function NetStatusHandler(e:*):void {
02     if (e.info.code=="NetStream.Play.Stop") {
03         ns.close();
04         var sleepTime:Timer = new Timer(200);
05         if (!sleepTime.hasEventListener(TimerEvent.TIMER)) {
06             sleepTime.addEventListener(TimerEvent.TIMER,SleepHandler);
07         }
08         sleepTime.running||sleepTime.start();
09         function SleepHandler(e:TimerEvent):void {
10             sleepTime.running&&sleepTime.stop();
11             sleepTime.removeEventListener(TimerEvent.TIMER, SleepHandler);
13         }
14     }
15 }
16 function onDataHandler(ee:Object):void {}
17 var nc:NetConnection=new NetConnection();
18 nc.connect(null);
19 var ns:NetStream=new NetStream(nc);
21 var myobj:Object = new Object();
22 myobj.onMetaData = onDataHandler;
23 ns.client = myobj;
24 var v:Video=new Video(640,440);
25 ns.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
26 v.attachNetStream(ns);
27 addChild(v);
posted @ 2010-05-16 19:43  rob_2010  阅读(339)  评论(0编辑  收藏  举报