播放本地视频的截图测试

最近项目需要做一个Adobe流媒体播放器,要求播放器打开后停止在视频的某一帧,

而不是点击播放按钮后才开始播放,即播放器打开后能看到视频的预览图像。下面是主要部分的测试代码:

                          private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			_nc = new NetConnection();
			_nc.connect(null);
			
			_ns = new NetStream(_nc);
			_ns.client = _metaDataObj;
			_metaDataObj.onMetaData = getMetaData;
			_ns.addEventListener(NetStatusEvent.NET_STATUS, onNsConnected);
			
			
			var camera:Camera = Camera.getCamera();
			_video = new Video(camera.width, camera.height);
			_video.smoothing = true;
			_video.attachNetStream(_ns);
			_ns.play(_filePath);
			addChild(_video);
			setTimeout(pause,2000);
		}
		
		private function pause():void
		{
			_ns.close();
			
			var bmd:BitmapData = new BitmapData(_video.width, _video.height);
			bmd.draw(_video);
			var bmp:Bitmap = new Bitmap(bmd);
			addChild(bmp);
			bmp.x = _video.width + 5;
		}

init函数主要是初始化连接,创建本地连接,播放本地视频,init函数的最后一行意在视频播放2秒后暂停,然后截取其图像。具体看pause函数:

 

此处调用了_ns.close();然后进行截图,结果出现安全错误导致截图失败,如下:

 

[Fault] exception, information=SecurityError: Error #2123: 安全沙箱冲突:BitmapData.draw:file:///F|/studyCase/FMSCase/flashCom/CaptureVideo/bin/CaptureVideo.swf 不能访问 null。未被授权访问任何策略文件。

 

如果此处调用_ns.pause();然后截图,则可以正常截图,不知原因何在?查阅帮助文档

close()的作用是停止播放流上的所有数据,将 time 属性设置为 0,并使该流可用于其它用途。

pause()的作用是暂停视频流的回放。

似乎看不出原因在哪里?

 

如果你就用pause当然可以解决问题,但这样的话,播放器打开后,它的状态应该为暂停状态了,而不是停止状态,这样似乎有点别扭。下面的讨论是如何解决

用close而导致的安全错误,用pause的朋友就可以不用看了....^_^

 

百度谷歌查了一下,有一下几种方法:

 

1。设置NetStream的checkPolicyFile为真,但我这是播放本地视频根本没有连接服务器,所以行不通!

2。在截图之前来一句:_video.attachNetStream(null);截图后再:_video.attachNetStream(_ns);但结果还是不行!

3。在EnterFrame事件中截图,即:

  a。设置一个全局变量_bmp:Bitmap,然后在init函数最后一行添加一句:addEventListener(Event.ENTER_FRAME, captureBmp);

  b。在captureBmp函数中截图:

      var bmd:BitmapData = new BitmapData(_video.width, _video.height);
          bmd.draw(_video);
          _bmp = new Bitmap(bmd);

    即:在EnternFrame事件中不停的截图,并保存在_bmp中。

  c。在两秒后的pause函数中删除EnterFrame事件的监听,然后将_bmp添加到舞台,这样就完成了截图。

 

不知道为什么第三种方法能够截图,也确实用的是NetStream.close()方法停止了视频,这样播放器的初始状态也是停止状态,确实解决了问题。

 

但是当播放时的视频文件位于网上时,如优酷上某个flv文件,那么有可能视频还为加载完成,延时已经执行了,EnterFrame事件已经停止了监听。

 

所以需要监听NetStream的NetStatusEvent事件,在返回的字符串为NetStream.Play.Start时,添加EnterFrame事件监听,设

置延时函数执行,及将init函数中的setTimeout(pause,2000)和addEventListener(Event.ENTER_FRAME, captureBmp);移出到NetStatusEvent

事件处理函数中,当监听到视频播放开始时,添加延时执行函数pause,添加EnterFrame事件监听函数captureBmp,假设延时为t。进过测试这样还是不能

保证能正确截图,应为这里还有视频的播放缓冲时间,t需要根据NetStream的bufferTime来确定。

 

下面是例子:

posted @ 2010-06-11 21:40  ywxgod  阅读(771)  评论(0编辑  收藏  举报