播放本地视频的截图测试
最近项目需要做一个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来确定。
下面是例子:
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。