Camera对象--FlashCom Develop阅读笔记 (九)

2006-03-09 00:40:31

这一节主要讲述camera对象的使用,包括camera的使用优化、设置合适的带宽和如果使得一个camera用于多个应用程序。 Camera对象允许你从摄影机捕捉视频并追加到任何一个MC中,当使用FlashMx Com server的时候,还可以在联机对象间传输、显示,甚至录制捕捉到的视频。应用这个特性,你可以开发例如视频会议、视频聊天等应用程序。当然你也可以不通过服务器来使用Camera对象,例如可以捕捉你的视频并附加到某个MC。 Camera常用的属性: 1: bandWidth 每秒种传送的最大字节数 2: currentFps 当前传送的fps值 3: fps setMode方法设定的fps值 4: name 当前使用的摄像机名称 5: names 可用视频捕捉设备的数组 6: index 可以视频设备的索引值 7: keyFrameInterval 关键帧间隔 8: loopback 是否压缩影像 9: motionLevel 灵敏度0~100 数值越高动作越迟钝 10: width 影像的宽度 11: height 影像的高度 12: quality 传送的影像品质0~100 13: muted 客户端是否允许Flash取用本地端的摄像机 需要创建Camera对象,使用下面代码: 1 : MyCamera = Camera.get(); 2 : //如果有多个视频设备,请使用index(索引值)指定设备 3 : MyCamera = Camera.get(index); 4 : 如果在不同的网域访问,就会弹出窗口让用户确认使用或是拒绝使用: 当用户对弹出窗口响应后就会触发onStatus事件,请参考muted参数 当然也可以记住用户的选择,点击鼠标右键出现设置窗口 在该窗口选择允许,并选中记住,下次就不会弹出确认窗口了。 更高级的示例是弹出设备选择窗口让用户选择: 1 : camArray = Camera.names; 2 : if (camArray.length == 1){ 3 : Camera.get(); 4 : } 5 : else 6 : System.showSettings(3);//弹出视频设置窗口 7 : Camera.get(); Flashcomguru 的 arckid 提供了一个很好的检测Camera的方法,把它略作修改如下 01 : function checkforCam() { 02 : camArray = Camera.names; 03 : if (camArray.length >= 1){ 04 : temp_cam = Camera.get(); 05 : if(temp_cam == -1) 06 : trace('视频设备正忙'); 07 : else 08 : trace('视频设备可用'); 09 : delete temp_cam; 10 : } else if (camArray.length == 0) { 11 : trace('没有视频设备'); 12 : } 13 : } 14 : //----------------------------------------------------------------- 15 : //或者下面的函数更精简: 16 : function checkForCam(){ 17 : return Camera.names.length; 18 : } 19 : function isCamBusy(){ 20 : if(arguments.length) return Camera.get(arguments[0]) == -1; 21 : return Camera.get() == -1; 22 : } 23 : 要设置Camera对象的模式,可以用setMode()方法,如下: 1 : MyCamera.setMode(width, height, fps [, favorSize]) 2 : //width,height 是Camera对象宽高,默认值是160×120 3 : //fps 捕捉视频的速率 默认值是15 4 : //favorSize 是一个可选的布尔值,默认为true,表示采用最大匹配当前的窗口大小的速率,如果设为false,则会优先考虑影像的流畅度。 不同带宽的建议设置 默认的Camera设置对所有的带宽提供了一个相同的足够好的传输品质,如果需要手动设置以适应不同的带宽要求,设置Camera参数的方法如下: 1: MyCamera.setQuality(bandwidth, frameQuality) 2: //bandwidth 频宽指每秒传送的最大字节数 默认为16384 如果设为0则维持frameQuality设定的影像品质,尽量使用最大频宽 3: //freamQuality 影像的压缩品质1~100,设为0表示在bandwidth设定范围内自动调整影像品质 4: 下面对不同的带宽给出了建议设置: 1: [ Modem ] 2: 较低画质,较高动作流畅度 my_cam.setQuality(4000,0) 3: 较高画质,较低动作流畅度 my_cam.setQuality(0,65) 4: [ DSL ] 5: 较低画质,较高动作流畅度 my_cam.setQuality(12000,0) 6: 较高画质,较低动作流畅度 my_cam.setQuality(0,90) 7: [ LAN ] 8: 较低画质,较高动作流畅度 my_cam.setQuality(400000,0) 9: 较高画质,较低动作流畅度 my_cam.setQuality(0,100) 打开和设置完Camera之后后要附加到一个视频实体才可以显示 1: MyVideo.attachVideo(MyCamera); 正常关闭camera 如果你的应用程序使用camera对象和NetStream对象记录数据,camera仍然保持打开状态,为了确保关闭Camera对象,请在结束的时候使用 1: NetStream.attachVideo(false) 在多个应用程序中使用同一个Camera 多个应用程序(swfs)可以在同时使用一个Camera。一般而言,多个浏览器窗口使用相同的进程,所以在浏览器环境中多个应用程序可以正常使用同一个Camera。但是,如果一个是在浏览器中运行,一个是独立应用程序,就不能共享使用同一个Camera,因为Camera不能被多个进程共享。 事件响应 在Camera有两个重要的事件响应 1. onStatus事件 muted属性变化会触发该事件 原参考手册中的一个示例可以说明onstatus的用法 01 : myCam = Camera .get (); 02 : myVideoObject.attachVideo(myCam); 03 : myCam.onStatus = function ( infoMsg ) { 04 : if ( infoMsg.code == 'Camera.Muted' ) 05 : { 06 : trace ( 'User denies access to the camera' ); 07 : } 08 : else 09 : trace ( 'User allows access to the camera' ); 10 : } 11 : // Change the Allow or Deny value to invoke the function 12 : System .showSettings(0); 2. onActivity事件 视频是否活动的事件响应 请参考原手册的范例: 1 : // Assumes a Video object named 'myVideoObject' is on the Stage 2 : c = Camera.get(); 3 : myVideoObject.attachVideo(c); 4 : c.setMotionLevel(10, 500); 5 : c.onActivity = function (mode) 6 : { 7 : trace(mode); 8 : };