守望者--AIR技术交流
标题:
把Camera绑定到StageVideo
[打印本页]
作者:
破晓
时间:
2015-3-20 15:33
标题:
把Camera绑定到StageVideo
赵客点评:据我所知,在做虚拟现实/增强现实等需要用到摄像头的Flash应用时,大家大都还在用传统的Video来呈现摄像头采集到的实现视频流。而根据Adobe内部的测试发现:在最理想的情况下,使用StageVideo呈现上述视频流,可以让CPU使用率降低85%!甚至完全由GPU解码和合成视频流。CPU在整个流水线中不会使用到!!!这就是传说中最佳性能的“direct path”场景。
当然想体验这个美好的传说,首先要满足三个条件:
用户的电脑/显卡支持GPU加速编解码器(H.264);
用户安装了Flash Player 11.4/AIR 3.4或以上版本;
StageVideo对象发挥着正常作用。
所以这里介绍Adobe全球技术专家(ACP)Joseph Labrecque写的一篇快速教程:
把Camera绑定到StageVideo
在过去,我们已经能够相对容易地把本地摄像头绑定到Flash Player中的视频显示对象。当然,flash.media.Video对象是传统的显示列表中的一部分,并没有被系统的图形处理器(GPU)加速。使用新的flash.media.StageVideo对象,我们可以在Flash显示列表的下方实现GPU加速的视频显示。但是在Flash Player 11.4以前,我们只能把摄像头绑定到Video,而不是StageVideo。值得庆幸的是,现在我们可以!
[attach]912[/attach]
如果你有一个摄像头,无论你在用什么设备阅读这篇教程,请试试下面的演示。你需要确保让Flash Player可以使用摄像头和麦克风。相信我 - 我没有通过这个捕捉到任何数据
。
赵客注:貌似新浪博客中的Flash文件无法正常显示。大家直接打开这个链接看吧。
http://inflagrantedelicto.memoryspiral.com/wp-content/uploads/2012/11/StageVideoCamera.swf
http://inflagrantedelicto.memoryspiral.com/wp-content/uploads/2012/11/StageVideoCamera.swf
需要Flash Player 11.4或以上版本
要让这个应用工作起来,只需要在您的ActionScript代码中完成几个步骤。我们需要处理的主要的类就是用flash.media.StageVideo实现GPU加速视频,用flash.media.Camera抓取本地摄像头对象提供图像给我们的视频。要让上述功能工作,你必须使用Flash Player的11.4或以上版本。
在ActionScript中,我们必须做一些必要的导入(只有几个!):
import flash.media.StageVideo;
import flash.media.StageVideoAvailability;
import flash.media.Camera;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.StageVideoEvent;
import flash.geom.Rectangle;
复制代码
我们做的第一件事是创建我们的StageVideo实例。要做到这一点,最安全的方法是等我们的类已经添加到舞台上之后,再为flash.events.StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY添加一个事件监听器。
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, availabilityChanged);
复制代码
StageVideo的可用性一旦改变,我们就可以通过在ActionScript中把一个引用赋值给一个变量的方式,把StageVideo实例设为stage.stageVideos [0],。
stageVideo = stage.stageVideos[0];
复制代码
现在,我们需要抓取flash.media.Camera对象,并把摄像头连接到我们的StageVideo。
camera = Camera.getCamera();
stageVideo.attachCamera(camera);
复制代码
最后的任务是侦听flash.events.StageVideoEvent.RENDER_STATE事件。在这时候,我们可以适当调整StageVideo的大小。这一点是我们绝对要做到的,因为的StageVideo最初的宽度和高度是0。
stageVideo.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
复制代码
下面是完整的代码:请注意:FLA 文件的舞台上有一个文本字段的实例,ID为:statusField。
package {
import flash.display.MovieClip;
import flash.text.TextField;
import flash.media.StageVideo;
import flash.media.StageVideoAvailability;
import flash.media.Camera;
import flash.events.Event;
import flash.events.StageVideoAvailabilityEvent;
import flash.events.StageVideoEvent;
import flash.geom.Rectangle;
public class Main extends MovieClip {
public var statusField:TextField;
private var camera:Camera;
private var stageVideo:StageVideo;
public function Main() {
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
protected function init(e:Event):void {
stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, availabilityChanged);
}
protected function availabilityChanged(e:StageVideoAvailabilityEvent):void {
statusField.appendText("StageVideo => " + e.availability + "\n");
if(e.availability == StageVideoAvailability.AVAILABLE){
stageVideo = stage.stageVideos[0];
attachCamera();
}
}
protected function attachCamera():void {
statusField.appendText("Camera.isSupported => " + Camera.isSupported + "\n");
if(Camera.isSupported){
camera = Camera.getCamera();
stageVideo.addEventListener(StageVideoEvent.RENDER_STATE, onRenderState);
stageVideo.attachCamera(camera);
}
}
protected function onRenderState(e:StageVideoEvent):void {
stageVideo.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
}
}
}
复制代码
想要完整的包吗?这里下载:
打包的代码和Flash Professional CS6项目
原文地址:
http://inflagrantedelicto.memory ... mera-to-stagevideo/
本文来自:
http://blog.sina.com.cn/s/blog_557bc4650101ck3j.html
作者:
lxz
时间:
2017-10-26 01:01
感谢分享!~
欢迎光临 守望者--AIR技术交流 (http://www.airmyth.com/)