这一节主要讲述camera对象的使用,包括camera的使用优化、设置合适的带宽和如果使得一个camera用于多个应用程序。
Camera对象允许你从摄影机捕捉视频并追加到任何一个MC中,当使用FlashMx Com server的时候,还可以在联机对象间传输、显示,甚至录制捕捉到的视频。应用这个特性,你可以开发例如视频会议、视频聊天等应用程序。当然你也可以不通过服务器来使用Camera对象,例如可以捕捉你的视频并附加到某个MC。
Camera常用的属性:
- bandWidth 每秒种传送的最大字节数
- currentFps 当前传送的fps值
- fps setMode方法设定的fps值
- name 当前使用的摄像机名称
- names 可用视频捕捉设备的数组
- index 可以视频设备的索引值
- keyFrameInterval 关键帧间隔
- loopback 是否压缩影像
- motionLevel 灵敏度0~100 数值越高动作越迟钝
- width 影像的宽度
- height 影像的高度
- quality 传送的影像品质0~100
- 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参数的方法如下:
- MyCamera.setQuality(bandwidth, frameQuality)
//bandwidth 频宽指每秒传送的最大字节数 默认为16384 如果设为0则维持frameQuality设定的影像品质,尽量使用最大频宽
-
- //freamQuality 影像的压缩品质1~100,设为0表示在bandwidth设定范围内自动调整影像品质
下面对不同的带宽给出了建议设置:
- [ Modem ]
较低画质,较高动作流畅度 my_cam.setQuality(4000,0)
较高画质,较低动作流畅度 my_cam.setQuality(0,65)
DSL ]
较低画质,较高动作流畅度 my_cam.setQuality(12000,0)
较高画质,较低动作流畅度 my_cam.setQuality(0,90)
LAN ]
较低画质,较高动作流畅度 my_cam.setQuality(400000,0)
较高画质,较低动作流畅度 my_cam.setQuality(0,100)
-
-
- [
-
-
- [
-
打开和设置完Camera之后后要附加到一个视频实体才可以显示
- MyVideo.attachVideo(MyCamera);
正常关闭camera
如果你的应用程序使用camera对象和NetStream对象记录数据,camera仍然保持打开状态,为了确保关闭Camera对象,请在结束的时候使用
- 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 : };