守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 809|回复: 1

[AIR技术] 把Camera绑定到StageVideo

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51757
    钢镚
    1422

    开源英雄守望者

    发表于 2015-3-20 15:33:13 | 显示全部楼层 |阅读模式
    赵客点评:据我所知,在做虚拟现实/增强现实等需要用到摄像头的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。值得庆幸的是,现在我们可以!



    如果你有一个摄像头,无论你在用什么设备阅读这篇教程,请试试下面的演示。你需要确保让Flash Player可以使用摄像头和麦克风。相信我 - 我没有通过这个捕捉到任何数据
    赵客注:貌似新浪博客中的Flash文件无法正常显示。大家直接打开这个链接看吧。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




    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-24 01:34
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    38

    帖子

    868

    积分

    上士

    Rank: 5Rank: 5

    威望
    20
    贡献
    0
    金币
    14
    钢镚
    0
    发表于 2017-10-26 01:01:17 | 显示全部楼层
    感谢分享!~
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-10-23 17:37 , Processed in 0.047827 second(s), 31 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表