Camera: Brew中的龙潭虎穴

Camera慢慢的成为手机的标配之一的时候给手机编程带来的麻烦也越来越大.尤其是能有一段通用的代码在各种不同屏幕尺寸手机上顺利运行更是非常困难。这次就谈谈Brew平台的Camera编程. 这次只讲Preview和Snapshot模式.Movie我们暂且不谈。和很多Brew接口很类似 Camera接口需要createinstance, 然后SetProperties(包括Size, Preview Size等等)当然很重要的就是要设置一个Callback function在每次得到新的Frame的时候做上相印的渲染操作

所以大致的代码看上去就是这个样子的
ISHELL_CreateInstance(iShell, AEECLSID_CAMERA, (void **)&m_pCamera);
ICAMERA_RegisterNotify(m_pCamera, _CameraNotify, pMe);
ICAMERA_SetSize(m_pCamera, &sz);
ICAMERA_Start(m_pCamera, CAM_MODE_PREVIEW, 0);

好问题就来了
第一个问题是有的手机非常恶心, For some devices,the camera works properly provided that there's an interval of at least 300 milliseconds between creating the ICamera instance and calling ICAMERA_Preview.所以在有的手机上需要用一个非常规的手段去打开Preview, 那就是MSLEEP(500),尽管这是一个强烈不推荐使用的接口.

第二个问题就是SetSize的问题了,GetSize这样的接口实际上是几乎不工作的。而且每个手机支持的size也是不同的,在这样的情况下怎么去填写size值呢.我们的办法也是比较极端的。其实所有的size都逃不出一定的范围
VGA(640*480) QVGA(320*240) QQVGA(160*120) CIF(352*288) QCIF(176*144)
在每次SetSize的时候都检查返回值,范围正确的那一次大致就是你想要的分辨率. 当然你可以按照自己的需求排序(在支持很多个分辨率的情况下)

其实第二个问题还是有潜在的问题的。那就是返回值并不是在每个手机上都表现的一致,因为有的手机根本返回的就是一个错的值.正确的值会在Callback中有所体现。所以这样的操作还是可能存在问题的.碰到这个情况就职能用宏将特殊代码隔开而为这个特殊手机做一个特殊版本了。

 

说到CallBack带来的就是另一个问题,先定义为问题三。就是这个异步操作的问题, 异步操作可能会有的问题在哪里呢
假设我们首先是ICAMERA_Start, 之后马上调用ICAMERA_Stop, 直观的想法是Camera被开启了然后马上关闭了.
但实际的情况是开启了没有关闭, 为什吗呢???Stop这个异步操作在Start的范围值没有在Callback中得意体现的时候被抛弃了.所以在处理这种类似的操作的时候,必须有一个event queue,在Camera busy处于等待CallBack的时候把后面的消息暂时保存起来。等空闲的时候在继续操作,这样可以帮助减少很多诡异的问题.

当然即使以上的这些都做到了还是有可能失败, 因为有的手机本身就存在着Bug. 比如著名的巧克力手机LG vx8550,按键是触摸式的, 有一个Heat Sensor去感应温度的不同而产生按键消息.但是原本没有关系的照相机去出了问题,可能Heat Sensor的中断优先级已经比较高了,但是热感应需要一定的时间来产生结果. 但是如果长时间的CPU被Camera抢占(比如1s 4-5个frame)那Heat Sensor总是没有时间去探测温度,去产生按键消息.这样的结果就是在打开Camera的时候所有的按键消息都失灵了, 你只能拔电池来解决了 还有一些恶心的手机像LG的vx9400,vx9800,vx9900,vx10000都是拿不到frame的bitmap,拿到的都是全黑色的像素,不知道他们是怎么搞的。有没有做过unittest(怎么都是LG...)

还有第四个问题就是
ICAMERA_SetParm(m_pCamera, CAM_PARM_PREVIEW_TYPE, CAM_PREVIEW_SNAPSHOT, 0);
的问题了, 这个频频出现在3.x的手机上, 不知道是手机实现的问题还是怎样,总是需要这个API的调用以帮助打开Preview Mode.
琢磨琢磨挺滑稽的 preivew_param with snapshot....彻底无语了
但是有的手机没有还不行, 世道世道...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值