本文是camera2参考概述,介绍 android.hardware.camera2
中重要的类。
文章翻译并整理自 https://developer.android.google.cn/reference/android/hardware/camera2/package-summary
视频在线观看:
- 极客笔记在线课程:
加入知识星球与更多camera同学交流
- 星球名称:深入浅出android camera
- 星球id: 17296815
android.hardware.camera2
是android设备上访问camera硬件设备的sdk,这是最新的camera api,替代已经废弃的接口,新的api我们称为camera2 api。
camera pipeline
camera设备被抽象成一个pipeline模型,这个pipeline的输入有两个:
- 从sensor获取到待处理的一帧一帧数据
- 从应用设置下来的一个一个处理请求(capturerequest)
数据与处理请求是一一对应的关系,每一帧数据对应一个独立的capturerequest。
pipeline的输出也有两个:
- 每帧数据的处理结果(captureresult),通常会分阶段输出多个captureresult,因此会是多个capturerequest组成的一整包结果(totalcaptureresult)
- 处理后的每帧数据,通常会被拆分成多路流输出(比如:预览流,视频流,拍照流等等)
这些capturerequest是按照顺序一个一个被处理的,通常需要150~300ms才能处理完一个capturerequest,为了达到至少30fps的帧率,就需要在整个pipeline中有多个capturerequest同时被处理,这些正在被处理的capturerequest分别处于不同的阶段。
cameramanager
可以通过cameramanager去枚举、查询和打开camera设备。
cameracharacteristics
每个camera设备都有一组静态属性信息,这组静态属性信息描述该camera设备的能力,可用的参数等,称之为cameracharacteristics。cameracharacteristics可以通过cameramanager#getcameracharacteristics
获取。
camera图像数据处理组件
预览
通常,我们使用surfaceview或者textureview(本质上使用surfacetexture)接收预览图像数据。
拍照
通过imagereader来获取拍照图像数据,设置format为jpeg时获取到jpeg图像,设置format为raw_sensor时获取到raw16图像(可以传给dngcreator生成dng格式的raw)。
后处理
应用程序通过surfacetexture或imagereader(设置format为yuv_420_888)接收到yuv图像数据后,可以送给opengl es,renderscript等组件进行处理。
capturerequest
应用程序在获取图像数据前需要先创建capturerequest,capturerequest包含两部分信息:
- 处理某一帧数据的参数设置列表
- 这一帧数据分成多少路数据流
调用cameradevice#createcapturerequest(int)
获取到capturerequest.builder
,通过builder来创建capturerequest。
capturerequest创建好后,可以通过两类方法将capturerequest送给camera设备进行处理:
cameracapturesession#capture
,有burst模式,可以一次送多个capturerequestcameracapturesession#setrepeatingrequest
,有burst模式,可以一次repeating一组capturerequest
repeating方式送capturerequest的优先级低于capture方式送capturerequest,所以在repeating过程中,如果有capture方式的capturerequest送下来,则会放在插入在repeating队列的最前面,以便有更高优先级送给camera设备处理。
captureresult
capturerequest处理完后,camera设备会产生一个totalcaptureresult 对象用于描述这一帧数据最终生效了哪些设置参数。实际生效的参数可能跟capturerequest里面填的参数有比较大的差异。
除了设置参数外,capturerequest里面设置的每一个output surface都会收到一帧图像数据。
应用收到图像数据和对应的captureresult是异步的,甚至有时候收到两者的时间点差别较大。
camera2 api类
类名 | 功能描述 |
---|---|
cameracapturesession | 基于某个cameradevice创建出来的cameracapturesession,有两个用途:1. 从cameradevice获取数据流;2. 再次处理同session获取到的数据流。 |
cameracapturesession.capturecallback | 一个回调对象,用于跟踪cameradevice处理capturerequest的进度。 |
cameracapturesession.statecallback | 一个回调对象,用于跟踪cameracapturesession的状态变化。 |
cameracharacteristics | 描述cameradevice的静态属性信息。 |
cameracharacteristics.key |
传递给cameracharacteristics#get 的参数,对应某个参数的key。 |
cameraconstrainedhighspeedcapturesession | 用于高帧率录像的cameracapturesession,通常size是会受到限制的。 |
cameradevice | 用于描述一个逻辑上的camera设备(有可能对应物理上多个camera设备)。 |
cameradevice.statecallback | 一个回调对象,用于接收camera设备的状态变化。 |
cameraextensioncharacteristics | 用于查询camera extensions支持的功能和分辨率。 |
cameraextensionsession | camera extensions使用的cameracapturesession,通常是多帧拍照或复杂的后处理拍照。 |
cameraextensionsession.extensioncapturecallback | 一个回调对象,用于跟踪cameradevice处理capturerequest的进度。 |
cameraextensionsession.statecallback | 一个回调对象,用于跟踪cameraextensionsession的状态变化。 |
cameramanager | 是一个system service,用于检测、描述和连接camera设备。 |
cameramanager.availabilitycallback | 一个回调对象,用于通知应用某颗camera能否被使用。 |
cameramanager.torchcallback | 一个回调对象,用于跟踪闪光灯模式切换,闪光灯是否可用状态。 |
camerametadata |
camera参数的基类。 |
cameraofflinesession | 离线模式的cameracapturesession,通过调用cameracapturesession#switchtooffline切换到离线模式。 |
cameraofflinesession.cameraofflinesessioncallback | 一个回调对象,用于跟踪cameraofflinesession的状态。 |
capturefailure | 用于描述处理某帧图像出现错误的报告。 |
capturerequest | 图像处理的请求,capturerequest创建后里面的内容是不可变的,包含处理图像的参数设置列表和输出数据流信息。 |
capturerequest.builder | 用于创建capturerequest对象。 |
capturerequest.key |
capturerequest.builder#set(key, object) 使用的参数key。 |
captureresult | 某帧数据处理后的结果参数信息,一个captureresult可能只包含一部分结果参数信息。 |
captureresult.key |
captureresult#get 使用的参数key。 |
dngcreator | dngcreator用于将raw16转换为dng。 |
multiresolutionimagereader | multiresolutionimagereader封装了多个imagereader,这些imagereader具有相同的buffer format,但在size、source camera id或者sensor mode可能不一样。 |
totalcaptureresult | 某帧数据处理后的所有结果参数信息。 |
camera2 api异常类
类名 | 功能描述 |
---|---|
cameraaccessexception | 当无法打开camera设备,或者已打开的camera设备出现故障时,应用会收到这个异常。 |