整体架构
首先系统定义了一个相机硬件抽象层,每个相机硬件都会适配好这层的接口。然后在hal的基础上framework层提供了一个camera service的服务,这个服务跑在media server进程中. 紧着在camera service的基础上,安卓sdk提供了camera1和camera2接口,当然camera1已经被废弃,被camera2代替了,camera2可以提供更全的功能和更细粒度的控制。jetpack在camera2的基础上推出camerax库,简化了api的调用。如果是开发较专业的相机应用,需要对相机做精细化的控制,建议用camera2接口,如果只是开发一个简单的相机功能,可以考虑用camerax,节省开发时间。
camera service
camera service服务主要有几个重要的类来来实现
- CameraService
CameraService 是整个摄像头服务的核心管理类,负责管理系统中的所有摄像头设备。它的主要职责包括:
枚举摄像头设备:通过调用硬件抽象层(HAL)接口,获取系统中所有可用的摄像头设备。
管理摄像头实例:处理应用程序的摄像头打开、关闭请求,管理摄像头实例的生命周期。
权限检查:确保只有具有适当权限的应用程序才能访问摄像头。
客户端管理:管理与应用程序的连接,处理来自不同应用程序的摄像头请求。
- CameraDeviceClient
CameraDeviceClient 是应用程序与Camera Service之间的桥梁。每个打开的摄像头设备都会对应一个CameraDeviceClient实例。它的主要职责包括:
配置摄像头设备:处理应用程序的配置请求,如设置捕获参数、创建捕获会话等。
捕获请求管理:接收和处理应用程序的捕获请求,将其传递给Camera HAL。
结果回调:将捕获结果和状态回调传递给应用程序。
- CameraProviderManager
CameraProviderManager 负责管理Camera HAL提供的摄像头设备。它的主要职责包括:
加载和初始化Camera HAL:加载不同版本的Camera HAL,并初始化摄像头设备。
设备枚举:枚举系统中所有可用的摄像头设备,并将其信息提供给CameraService。
设备管理:管理摄像头设备的生命周期,处理设备的添加、移除等事件。
cameara api
分为三类:camera1, camera2, cameraX. 因为camera1已经被废弃,这里主要介绍camera2和camerax
camera2
主要类
CameraManager: 用于管理和查询设备上的摄像头。它提供了获取摄像头列表、打开摄像头设备等功能
CameraDevice:是一个抽象类,表示一个打开的摄像头设备。它提供了创建捕获会话、发送捕获请求等功能
CaptureRequest: 一个请求类,预览,拍照,录制都可以创建一个请求来实现
CameraCaptureSession: 用于管理摄像头的捕获会话。它负责处理捕获请求并将捕获的图像数据传递给应用程序
camera x
camerax在camera2的基础上简化了开发步骤,例如直接提供了一个预览控件preview, 拍照和录制可以直接用相应的类ImageCapture和VideoCapture来完成,并且直接指定文件即可,不需要开发者直接操作帧数据。
ProcessCameraProvider: 用于管理摄像头的生命周期和绑定摄像头用例
PreviewView: 预览控件
ImageCapture: 用于拍照
VideoCapture: 用于录制视频
预览,拍照,录制实现原理
因为camerax是在camera2的基础上封装得到的,所以这里以camera2为例子介绍原理。
1.创建一个预览控件,例如surfaceview,textureview
2, 把相机的预览地址设置为控件中的surface
- 创建一个预览请求,这个请求逐层传递,应用层->camera service->camera hal。最终由硬件驱动层来处理,硬件驱动层会把每一帧的数据传到surface,给camera下达命名,把预览画面输出到surface, surfaccetexture进而把数据转为texture, 然后预览控件显示这个texture
同样的,拍照和录制也是创建一个请求,然后交给camera service处理