守望者--AIR技术交流

标题: 把Camera绑定到StageVideo [打印本页]

作者: 破晓    时间: 2015-3-20 15:33
标题: 把Camera绑定到StageVideo
赵客点评:据我所知,在做虚拟现实/增强现实等需要用到摄像头的Flash应用时,大家大都还在用传统的Video来呈现摄像头采集到的实现视频流。而根据Adobe内部的测试发现:在最理想的情况下,使用StageVideo呈现上述视频流,可以让CPU使用率降低85%!甚至完全由GPU解码和合成视频流。CPU在整个流水线中不会使用到!!!这就是传说中最佳性能的“direct path”场景。
当然想体验这个美好的传说,首先要满足三个条件:


所以这里介绍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中,我们必须做一些必要的导入(只有几个!):

  1. import flash.media.StageVideo;
  2. import flash.media.StageVideoAvailability;
  3. import flash.media.Camera;
  4. import flash.events.StageVideoAvailabilityEvent;
  5. import flash.events.StageVideoEvent;
  6. import flash.geom.Rectangle;
复制代码
我们做的第一件事是创建我们的StageVideo实例。要做到这一点,最安全的方法是等我们的类已经添加到舞台上之后,再为flash.events.StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY添加一个事件监听器。
  1. stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, availabilityChanged);
复制代码



StageVideo的可用性一旦改变,我们就可以通过在ActionScript中把一个引用赋值给一个变量的方式,把StageVideo实例设为stage.stageVideos [0],。
  1. stageVideo = stage.stageVideos[0];
复制代码



现在,我们需要抓取flash.media.Camera对象,并把摄像头连接到我们的StageVideo。
  1. camera = Camera.getCamera();
  2. stageVideo.attachCamera(camera);
复制代码



最后的任务是侦听flash.events.StageVideoEvent.RENDER_STATE事件。在这时候,我们可以适当调整StageVideo的大小。这一点是我们绝对要做到的,因为的StageVideo最初的宽度和高度是0。
  1. stageVideo.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
复制代码



下面是完整的代码:请注意:FLA 文件的舞台上有一个文本字段的实例,ID为:statusField。

  1. package  {
  2.     import flash.display.MovieClip;
  3.     import flash.text.TextField;
  4.     import flash.media.StageVideo;
  5.     import flash.media.StageVideoAvailability;
  6.     import flash.media.Camera;
  7.     import flash.events.Event;
  8.     import flash.events.StageVideoAvailabilityEvent;
  9.     import flash.events.StageVideoEvent;
  10.     import flash.geom.Rectangle;
  11.      
  12.     public class Main extends MovieClip {
  13.          
  14.         public var statusField:TextField;
  15.          
  16.         private var camera:Camera;
  17.         private var stageVideo:StageVideo;
  18.          
  19.         public function Main() {
  20.             this.addEventListener(Event.ADDED_TO_STAGE, init);
  21.         }
  22.          
  23.          
  24.         protected function init(e:Event):void {
  25.             stage.addEventListener(StageVideoAvailabilityEvent.STAGE_VIDEO_AVAILABILITY, availabilityChanged);
  26.         }
  27.          
  28.         protected function availabilityChanged(e:StageVideoAvailabilityEvent):void {
  29.             statusField.appendText("StageVideo => " + e.availability + "\n");
  30.             if(e.availability == StageVideoAvailability.AVAILABLE){
  31.                 stageVideo = stage.stageVideos[0];
  32.                 attachCamera();
  33.             }
  34.         }
  35.          
  36.         protected function attachCamera():void {
  37.             statusField.appendText("Camera.isSupported => " + Camera.isSupported + "\n");
  38.             if(Camera.isSupported){
  39.                 camera = Camera.getCamera();
  40.                 stageVideo.addEventListener(StageVideoEvent.RENDER_STATE, onRenderState);
  41.                 stageVideo.attachCamera(camera);
  42.             }
  43.         }
  44.          
  45.         protected function onRenderState(e:StageVideoEvent):void {
  46.             stageVideo.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
  47.         }
  48.          
  49.     }
  50.      
  51. }
复制代码
想要完整的包吗?这里下载:打包的代码和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/)