FlexBuilder4.6创建手机项目之调用摄像头
FlexBuilder4.6创建手机项目之调用摄像头
因为最后要将项目导出到手机上,所以与直接创建flex项目调用摄像头是有所区别的,在新版的API(SuperFlex)中有的标注手机项目未优化,所以在使用标签时应注意。
调用摄像头会使用camera类和video类相互绑定的方法或者使用cameraUI类。关于camera和cameraUI的用法大家可以查看AS3.0或者API。这里有一篇博客,作者写了用camera和用cameraUI的优缺点以及一些简单的代码:
http://hi.baidu.com/tongyjung/item/5a2c7bd0ef05801ee1f46f0a(附录1)
有的资料显示可以使用camera方法调用摄像头,但是我在实例中发现在模拟器中能调用摄像头但是导出到手机上就不能成功。实例代码如下:这是我的mic.as文件
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.media.Camera;
import flash.media.Video;
private var cam:Camera;
private var vid:Video;
public function ini(e:MouseEvent):void {
cam = Camera.getCamera();
if (!cam) {
trace("No camera is installed.");
}
else {
connectCamera();
}
}
private function connectCamera():void {
vid = new Video();
vid.width = cam.width;
vid.height = cam.height;
vid.attachCamera(cam);
sve.addChild(vid);
}
这是我的micCameraView.mxml文件:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="主页视图">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script source="mic.as"/>
<s:SpriteVisualElement id="sve" x="10" y="39" width="100" height="100"/>
<s:Button id="btn" x="325" y="65" label="PRESS" click="ini(event)"/>
<s:Label id="label" x="140" y="231" text="hello camera"/>
</s:View>
关于camera中设置mode参数和quality参数,可参看这篇博客:
http://www.turen.me/archives/44(附录2)
CameraUI 类允许您使用设备上的默认摄像头应用程序捕获静态图像或视频。所以相对来说cameraUI还是比较简单的。下面是我用cameraUI写的调用摄像头的代码,在运行其过程中发现在FlashBuilder自带模拟器中是不能运行的,并且下面的label会显示没有安装摄像头,但是导出到安卓手机上是能够运行的。
这是我的cam.as文件:
import flash.events.MouseEvent;
import flash.media.Camera;
import flash.media.CameraUI;
import flash.media.MediaType;
public var cam:CameraUI;
protected function ini():void{
btn.addEventListener(MouseEvent.CLICK, onClick);
}
protected function onClick(event:MouseEvent):void{
if(CameraUI.isSupported){
var cam:CameraUI = new CameraUI();
cam.launch(MediaType.VIDEO);
}
else{
la.text = "您没有安装摄像头";
}
}
这是我的cameraView.mxml文件:
<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" title="主页视图" creationComplete="ini()">
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script source="cam.as"/>
<s:SpriteVisualElement id="sve" x="10" y="39" width="100" height="100"/>
<s:Button id="btn" x="368" y="79" label="打开摄像头"/>
<s:Label id="la" x="221" y="241" text="您是否安装了摄像头"/>
</s:View>
********************************************************************************
附录1:
AIR for Android (三) 摄像头和相册
使用手机摄像头:
要使用手机设备的摄像头有两种方式,一种是用传统的Camera和Video相互绑定的方式。另一种则是使用新提供的CameraUI类来调用手机原生的照相机应用。
它们各自有各自的优点缺点,使用传统方法,可以让你自定义你的照相机APP的外观,功能等。
而用CameraUI的话则可以允许你调用一个已经开发的相对比较完备的照相机app,可以省去你许多时间。
假如你要做类似Camera360那种app的话,那么可能只能用传统方式来定制你的app,包括实时的滤镜效果等等。
而如果你的app只是在用户拍摄的相片上做文章的话,用CameraUI然后获取拍摄后的数据进行操作就行了。
(自己测试了一下,传统的方式在手机上运行非常卡)
CameraUI方式的调用
flash.media.CameraUI;
flash.meida.MediaPromise;
flash.media.MediaType;
我们会用到上面三个类。
//检测设备是否支持CameraUI
if(CameraUI.isSupported){
//检查cameraUI对象是否为空,只有在第一次单击时才进行实例化
if(cameraUI == null){
cameraUI.addEventListener(MediaEvent.COMPLETE,onMediaComplete);
//拍摄完成事件的侦听
cameraUI.addEventListener(Event.CANCEL,onMediaCancel);
//取消拍摄的侦听
cameraUI.addEventListener(ErrorEvent.ERROR,onMediaError); //出错
}
//启动手机中的照相程序,这里使用了MediaType的IMAGE属性。那么如果用VIDEO的话就是打开录像
cameraUI.launch(MediaType.IMAGE);
}
function onMediaComplete(event:MediaEvent):void
{
var mediaData:MediaPromise = event.data;
image_loader.loadFilePromise(mediaData);
}
使用传统方式调用摄像头、写入照片到媒体库及打开媒体库
flash.media.CameraRoll;
flash.media.Video;
flash.media.Camera;
我们会用到上面的三个类。其中下面两个是很熟悉的。第一个类就是可以用来让我们访问媒体库的类
//先判断cam是否为空,因为系统当前可能没有可用的摄像头
if(cam != null){
cam.setMode(v.width,v.height,30);
cam.setQuality(0,0);
video.attachCamera(cam);
}
//点击拍照按钮后执行的内容
function onClick(event:MouseEvent):void{
var bd:BitmapData = new BitmapData(v.width,v.height,false,0xFFFFFF);
bd.draw(video);
video.attachCamera(null);
btn.mouseEnabled = false;
if(CameraRoll.supportsAddBitmapData){
cameraRoll.addBitmapData(bd);
}
}
//点击了打开媒体库按钮后执行内容
function onClick(event:MouseEvent):void{
//判断是否支持browseForImage方法
if(CameraRoll.supportsBrowseForImage == true){
if(cameraRoll == null){
cameraRoll = new CameraRoll();
cameraRoll.addEventListener(MediaEvent.SELECT,onMediaSelect);
cameraRoll.addEventListener(Event.CANCEL,onMediaCancel); cameraRoll.addEventListener(ErrorEvent.ERROR,onMediaError);
}
cameraRoll.browseForImage();
}
}
在选择了图片之后,可以用CameraUI中提到的方法,用loader加载MediaPromise格式的数据。
*******************************************************************************
附录2:
Flex中设置Camera的视频清晰质量的最佳配合
今天需要设置Flex中的Camera组件的一些属性,后来发现清晰度不是很高,于是鼓捣了上
午半天,设置了很多的参数,竟然发现手册上就是现成的一些设置方法,郁闷!不过我还是专门设置了几个有用和必要的属性,为自己的程序中应用,其实很简单!以此为例:
Camera.setMode(320,24,15);
就是要设置一个宽320、高240、播放速率是15fps,他的带宽消耗:
(320*240*15)/1000000 = 1.2(Mbps) = 1152000(Bps) //1000000是1024*1024的取舍写法即:1000*1000而获得的;
关于所消耗的带宽,换成我们能看懂的带宽计算就是:320*240*15/8000 = 144K/s(也即每秒144K) //由此可见,画面的尺寸和播放率的播放效果是跟带宽有一定的关系的
接下来可以这样设置视频的质量:由于在设置的时候function setQuality(bandwidth:int, quality:int)使用的单位是不一样的,bandwidth使用的是kbps,而不是Bps,要转换(8 bits =1 byte ),所以要转换一下1152000/8 = 144000(Kbps),
接下来要设置播放的质量的时候必须这样设置:
Camera.setQuality(144000,85); //(85为常规的视频质量。最好就采用这个数值)
接下来就是设置传输的视频关键帧了,可以根据实际的带宽情况来设置,记住:关键帧数值越小带宽使用率越大,反之关键帧数值越大带宽使用率越小。值 例如:1 表示每一帧都是关键帧,那么就是每帧都要传输出去,就会加大带宽的使用了,依此类推。可接受值为 1 至 48。对于画面质量要求不高的话,可以设置到48;对于质量要求很高的话,最好设置到5-10左右;Camera.setKeyFrameInterval(48); 对于摄像头来说,最佳的成像比例是4:3,所以最好是将所成像的比例按照这个最小比例设置!下面是网络摄像头和数字视频摄像头内置的典型设置: 160 * 120 ; 176 * 144 ; 320 * 240 ; 360 * 240 ;352 * 288 ; 640 * 480 本地视频捕捉分辨率一般都设置为4:3(宽和高)的比例。虽然没有操作比例的必要,当你入门它不是一个坏的想法。用4:3的比例,您能够优化你的摄像头看到的东西。 一些Flex的Camera的常规设定: 打开摄像头: Camera camera = Camera.getCamera(); //将摄像头的捕获模式设置为最符合指定要求的本机模式 camera.setMode(240,180,15); //指定进行完整传输而不由视频压缩算法进行插值处理的视频帧(成为关键帧)。 camera.setKeyFrameInterval(60); //设置每秒的最大宽带或当前输出视频输入信号所需的画面质量 camera.setQuality(144,85); Video video = new Video(camera.width * 2, camera.height * 2); //正在捕获视频数据的Camera对象 video.attachCamera(camera); 关闭摄像头: //如果getCamra()返回null,则表明摄像头正由另一个应用程序使用,或者系统上没有安装摄像头。 camera = Camera.getCamera(null); camera = null; //正在捕获视频数据的Camera对象。若要切断与该Video对象的连接,请传递null video.attachCamera(null);
转载请注明:土人的国度 ? Flex中设置Camera的视频清晰质量的最佳配合