一篇文章带你了解Android 最新Camera框架

发布网友 发布时间:2025-01-22 09:41

我来回答

1个回答

热心网友 时间:2025-01-24 02:39

这篇文章主要从以下几个方面展开讲解:

1) Android 最新Camera 整体框架

Android最新Camera整体框架主要包括三个进程:应用层进程、camera server进程、HAL进程(provider进程)。进程之间的通信通过binder实现,其中应用层与camera server通信使用AIDL,camera server与HAL通信使用HIDL。

Android系统框架分级,大致分为应用层、framework层和HAL层。设备上的实际进程情况可以参照下图,可以看到存在cameraserver和provider进程。cameraservice负责应用层与framework层的通信,而provider进程则负责framework和HAL层之间的通信。

Android 8.0重新设计了Android操作系统框架,以“Treble”项目为依托,旨在让制造商能够以更低的成本更轻松、更快速地将设备更新到新版Android系统。自Android O之后,使用Treble架构以解决Android系统的碎片化问题和提高系统更新效率,减少了framework和HAL的耦合性,进而引出HIDL的概念。

HIDL,即HAL接口定义语言,用于指定HAL与其用户之间的接口,是一个接口描述语言。HIDL目标是使框架可以在无需重新构建HAL的情况下进行替换。HAL由供应商或SOC制造商构建,并放置在设备的“vendor”分区中,框架则在其自己的分区中通过OTA进行替换,无需重新编译HAL,这是Project Treble框架设计的目的。

下图展示了Android Camera的最新框架,对整体框架有大致了解。

2) Android Camera2 和HAL3 的基本了解

从Android 5.0开始,Google引入了全新的相机框架Camera2(android.hardware.camera2),并废弃了旧的相机框架Camera1(android.hardware.Camera)。

Camera1过于简单,无法满足更复杂的相机应用场景。为了给应用层提供更多相机控制权限,构建出更高质量的相机应用程序,Google推出了Camera2接口。

Camera2相比Camera1,有以下高级特性:

1) 在开启相机前检查相机信息,可检查闪光灯是否可用。

2) 在不开启预览的情况下拍照。

3) 一次拍摄多张不同格式和尺寸的图片。

4) 控制曝光时间,提高图像亮度。

5) 连拍功能,支持连续拍摄多张图片。

6) 灵活的3A(AF、AE、AWB)控制。

为了配合Camera2的使用,Android HAL层相机框架做了相应的改动,即HAL3。

在Camera2 API中涉及到的类包括Pipeline、Supported Hardware Level、Capture等,下面是各个类的使用解释:

1) Pipeline

Camera2的API模型被设计为Pipeline,顺序处理每一帧请求并返回结果给客户端。

下图展示了Pipeline的工作流程,通过一个简单的例子详细解释。

假设想要同时拍摄两张不同尺寸的图片,并且在拍摄过程中闪光灯必须亮起。整个拍摄流程如下:

1) 创建用于从Pipeline获取图片的CaptureRequest。2) 修改CaptureRequest的闪光灯配置,让闪光灯在拍照过程中亮起。3) 创建不同尺寸的Surface接收图片数据,并将它们添加到CaptureRequest中。4) 发送配置好的CaptureRequest到Pipeline等待返回拍照结果。

新的CaptureRequest会被放入Pending Request Queue队列等待执行,当In-Flight Capture Queue队列空闲时,从Pending Request Queue获取若干待处理的CaptureRequest,根据每个CaptureRequest的配置进行Capture操作。最后从不同尺寸的Surface获取图片数据并得到包含与拍照相关信息的CaptureResult。

2) Supported Hardware Level

相机功能的强弱与硬件相关,不同厂商对Camera2的支持程度不同,因此Camera2定义了重要概念“Supported Hardware Level”,用于根据功能的支持情况将不同设备的Camera2划分为多个级别,以便开发者大致了解当前设备上Camera2的使用情况。

截止到Android P为止,从低到高有四个级别:LEGACY、LIMITED、FULL和LEVEL_3。

3) Capture

相机的所有操作和参数配置最终服务于图像捕获,如对焦是为了使某个区域图像清晰,调节曝光补偿是为了调节亮度。因此,在Camera2中,所有相机操作和参数配置都被抽象为Capture(捕获)。Capture操作可能仅是为了让预览画面更清晰而进行对焦。

Capture根据执行方式分为单次模式、多次模式和重复模式,下面解释:

•单次模式:执行一次Capture操作,如设置闪光灯模式、对焦模式和拍照。多个一次性模式的Capture会按顺序执行。•多次模式:连续多次执行指定的Capture操作,不允许在拍摄期间插入其他Capture操作。•重复模式:不断重复执行指定的Capture操作,当有其他模式的Capture提交时会暂停,执行完毕后恢复。

下面的例子进一步说明三种模式的执行流程。

总结重要注意事项:

1) Capture操作按顺序串行执行,不存在并行执行。2) 重复模式的CaptureRequest和其他模式的参数存在差异,如不会配置AF_TRIGGER_START。3) 拍照时未配置预览Surface可能导致预览画面卡顿。

其他关键功能包括CameraManager(查询和建立相机连接)、CameraCharacteristics(提供相机信息)、CameraDevice(管理相机设备)、Surface(接收图像数据)和CameraCaptureSession(配置目标Surface的Pipeline实例)。

在代码实战中,以拍摄单张照片为例,使用ImageReader创建接收照片的Surface,通过CaptureRequest配置拍照参数并提交给相机,最后通过ImageReader回调获取JPEG图像数据进行保存。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com