1.4Metadata与Characteristics

12 篇文章 23 订阅

在上一节我们已经学习过Camera的参数通过Session下发到HAL层,这一节我们将详细探索CameraMetadata。

在公开的SDK中,除了CameraMetadata类之外,还存在三个继承它的子类,分别是CameraCharacteristicsCaptureRequestCaptureResult类。
通过名字,我们可以轻易地分析出CameraCharacteristics类是描述Camera特征的,所以这个类中的键值在Camera open之前就可以获得;
CaptureRequestCaptureResult两个类很明显是Capture过程下发值和返回的结果。这里的Capture不是指拍照,而是指相机捕捉画面、可以是预览、拍照或录像。

一、CameraCharacteristics

初始化

Kotli代码:

cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)

在这个类中(Android 9.0)有key值110项(含已废弃),这些值中有一些是比较常用的整理在这里。

1. SCALER_STREAM_CONFIGURATION_MAP

这个值应该是Camera开发必用到的一个值,用于获取Camera配置的分辨率列表。

val map = characteristics.get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP ) ?: return

通过这个map就可以选择我们希望的分辨率,例如拍照时4:3 800万像素一般就是3264*2448分辨率,录像时1080P就是1920*1080像素。

2. SCALER_AVAILABLE_MAX_DIGITAL_ZOOM

一般相机应用都有会数字变焦,相机能设置的最大ZOOM就是通过这个值确定。Zoom分为IPS和Sensor两种形式,一般采用ISP的方式也就是我们通常意义的数字变焦的效果。这里的最大值是在底层配置的,但是在APP开发时,这个最大值是可以被突破的。

例如获取的max zoom是8,但是在设置时设置为32,实际效果会出现32倍的效果。也即是这个值并非ISP所需要的,而实Android System的设置,但是系统并没有做过多的限制。

这个情况也许根据不同厂商、高通MTK平台不同会有不同现象,未验证。

3. CONTROL_AE_AVAILABLE_MODES

自动曝光模式列表,有OFF、ON、AUTO FLASH、ALWAYS FLASH、AUTO FLASH REDEYE、EXTERNAL FLASH六个可选值。在Session中发Request时,通过这个key值得到设备支持的模式列表就是能够传的值。

Android要求

  1. 所有相机设备都支持ON,所有带有flash单元的相机设备都支持ON_AUTO_FLASH和ON_ALWAYS_FLASH。
  2. 全模式相机设备始终支持OFF模式,这使得应用程序可以控制相机的曝光时间、灵敏度和帧持续时间。
  3. LEGACY模式的相机设备不支持OFF模式。如果LITIMED模式设备支持MANUAL_SENSOR功能,则它们将支持OFF模式。

由于现在一般Android设备都支持闪光灯,所以理论上ON、AUTO FLASH、ALWAYS FLASH三种模式是所有设备都支持的。

4. CONTROL_AF_AVAILABLE_MODES

自动对焦模式,有OFF、AUTO、MACRO、CONTINUOUS VIDEO、CONTINUOUS PICTURE、EDOF六中模式,对应0到5。但是笔者在部分高通平台的机器上发现返回的列表中出现了两次0,查看HAL层的定义,多出了一个FIXED的选项,推测是定焦模式,MTK平台无此现象。由于平台baseline不同,此处需要稍加注意。

5. CONTROL_AWB_AVAILABLE_MODES
白平衡模式,SDK支持OFFAUTOINCANDESCENTFLUORESCENTWARM_FLUORESCENTDAYLIGHTCLOUDY_DAYLIGHTTWILIGHTSHADE9种模式。大部分机器都是全支持,或者仅仅不支持OFF模式。
白平衡模式是不同于场景模式的,白平衡模式只是修改了白平衡的值,场景模式则涉及到对焦方式、gama、白平衡等多项参数。
6. SENSOR_INFO_PIXEL_ARRAY_SIZE

这个值实际上就是相机最大Size组成,当需要获取最大size时,可以直接获取。

7. SENSOR_ORIENTATION

这个值也是非常常用的,这个值就是用于修正屏幕与相机sensor之间夹角的,以便图片与设备显示方向一致。

Kotlin代码:

private fun getOrientation(rotation: Int): Int {

return (ORIENTATIONS.get(rotation) + mSensorOrientation + 270) % 360

}

这段代码是Google给的Camera2Demo上的方法,但是这个方法理论上并不是能完全覆盖所有情况,在Android源码Framework的编译doc中有给出全场景的公式,在Framework部分会再具体讲。

8. INFO_SUPPORTED_HARDWARE_LEVEL

这个值就是当前设备对API2的支持情况,一般在使用API2时需要首选判断支持级别,在Android P开始,google要求所有的Android设备都必须支持API2,并满足相关测试才可以上市,所以对于P和Q而言基本都是支持的。

以上8个值基本上就是CameraCharacteristics类最常用到的8Key值。

二、CaptureRequest和CaptureResult

在前面的介绍中,我们已经知道这两个类request用于设定,result用于查询结果,二者都是在session中存在的。

Characteristics类中,我们获取了大量设备支持的元数据的列表和信息,这些信息就是我们针对这个设备的取值范围。

例如,设备的可用AF模式为123,那么在构建requestbuilder时,就只能从这三个值中选择。

Kotlin代码

captureBuilder.set(

    CaptureRequest.CONTROL_AF_MODE,

CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE

)

在设置下发后,可以在CameraCaptureSession.CaptureCallback()回调中查询结果,验证是否设置成功。

val afMode = result.get(CaptureResult.CONTROL_AF_MODE)

session中,除了3A之外,对焦状态也是非常需要关注的,

CONTROL_AF_STATE,它的状态是绘制对焦框、实现手动和自动对焦的主要参数。

FPSRequest是无法直接获得的,需要开发者自行计算,具体的实现方式可以参考Android源码中的DevCamera部分。

 

结语:

至此,第一部分Camera APP开发实际上就已经结束了,在这部分介绍了SDK层面perview的实现逻辑,不同类之间的关系和相关用法。关于拍照和录像功能实际上逻辑与预览是一致的,就不在此赘述。

笔者无意做一个代码搬运工,所以没有过多的贴出源代码,相关源代码实现将会在整个系列结束时放到github上。

下一部分将进行Framework的逻辑分析和代码分析。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值