Android Camera API2架构和流程介绍

273640700e54f2e7f39b15d7878a7802.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、简介
二、Camera API2 架构
2.1 Camera应用框架
2.2 Camera AIDL
2.3 Camera Native 框架
2.4 Camera binder IPC 接口
2.5 CameraService
2.6 Camera HAL
三、Camera API 2 操作流程
3.1 Camera参数获取操作
3.2 openCamera操作
3.3 CreateCaptureSession
3.4 request下发(起预览、拍照等操作)
3.5 Camera Hal回帧
四、参考

一、简介

Camera API 2 (下面用Camera2简称)是最新的 Android 相机框架 API,它取代了已弃用的相机框架库(Camera API 1)。Camera2 为复杂的用例提供深入的控制,但需要用户管理特定于设备的配置。用户可以在相应的参考文档中了解 Camera2 中的特定类和函数。总体上Camera遵循Client-Server架构,通过Binder通讯完成Camera APP -> Camera API2 -> CameraService -> Camera Hal流程。

二、Camera API2 架构

图2.1描述了Camera整体软件架构。

acbf287e0ad988bcdc945e197412df80.jpeg

图2.1 Camera软件架构

Camera软件架构图从上到下可分为Camera应用框架、Camera AIDL、Camera Native 框架、Camera binder IPC 接口、Camera HAL六大部分。

2.1 Camera应用框架

Camera应用框架是Camera APP代码,它使用 Camera2 API 与Camera硬件进行交互,交互过程中会调用相应的 Binder 接口,以访问与Camera底层交互的原生代码。

Camera API2中CameraManager用于openCamera、CameraDevice用于创建CameraCaptureSession(配流)。

2.2 Camera AIDL

Camera AIDL接口是Camera API2与CameraService的连接桥梁,与 CameraService关联的 binder 接口可在frameworks/av/camera/aidl/android/hardware中找到。生成的代码会调用Camera hal的原生代码以获取对实体Camera的访问权限,并返回用于在框架级别创建 CameraDevice并最终创建 CameraCaptureSession对象的数据。

2.3 Camera Native 框架

此框架位于 frameworks/av/中,并提供相当于 CameraDevice和 CameraCaptureSession类的原生类,另请参阅 NDK camera2 参考。Camera Native框架包含了CameraService、Camera metadata等

2.4 Camera binder IPC 接口

IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的若干个相机 binder 类位于 /frameworks/av/camera/aidl/android/hardware/目录中。

  • ICameraService 是相机服务的接口;

  • ICameraDeviceUser 是已打开的特定相机设备的接口;

  • ICameraServiceListener 和 ICameraDeviceCallbacks 分别是对应用框架的 CameraService 和 CameraDevice 回调接口。

2.5 CameraService

路径:frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相机服务是与 HAL 进行互动的实际代码。

2.6 Camera HAL

硬件抽象层定义了由相机服务调用、且您必须实现以确保相机硬件正常运行的标准接口。

三、Camera API 2 操作流程

74561889f4800a5a79744d2d84f008e2.jpeg

图 3.1 Camera API 2 操作流程

Camera API2的核心操作流程如图3.1。从左到右分为三个模块,分别是Camera APP、Camera2 API、Camera Device HardWare(由Camera hal控制)。

下面简要介绍Camera API2操作流程:

3.1 Camera参数获取操作

当app调用 Context.getSystemService()获得CameraManager后。其一,需要通过CameraManager对象注册Camera可用的回调(AvailabilityCallback),用于判断Camera是否可用,可用的状态下才执行CameraManager.openCamera操作;其二,需要通过getCameraIdList获取可用的Camera逻辑id;其三,通过getCameraCharacteristics获取Camera Characteristic信息,如Camera尺寸,3A参数等描述CameraDevice的信息。

3.2 openCamera操作

CameraManager.openCamera用于打开相机,openCamera成功会返回CameraDevice,失败会返回错误码。详见/frameworks/base/core/java/android/hardware/camera2/CameraDevice.java,app侧可通过重写的 CameraDevice.StateCallback 的 onOpened、onDisconnected、onError 方法得知当前 CameraDevice 的状态。

openCamera简要流程:CameraManager.openCamera - > CameraService.connectDevice -> CameraManagerProvider.openSession -> Camera hal openCamera。

3.3 CreateCaptureSession

CameraDevice.CreateCaptureSession就是配流的操作,一般配置预览、拍照、录像流,对应的surface有surfaceview或者surfaceTexture、imageReader创建的surface、MediaRecorder;配流会配置设置默认的CaptureRequest模板参数,如预览的CameraDevice.TEMPLATE_PREVIEW,录像的CameraDevice.TEMPLATE_RECORD,拍照的CameraDevice.TEMPLATE_STILL_CAPTURE。配流可以理解为配置流的输出容器,以Camera hal为buffer的生产者,那么就是配置outConfigurations。

  • CreateCaptureSession简要流程:CameraDevice.CreateCaptureSession -> CameraDeviceImpl.createStreams -> CameraDeviceClient.mHidlSession.configureStreams -> Camera hal configureStreams。

3.4 request下发(起预览、拍照等操作)

request下发是是processCaptureRequest流程。配流完成后,通过CameraCaptureSession.StateCallback可以获取CameraCaptureSession对象用于后续的起预览(setRepeatingRequest)、拍照或者对焦(capture)、停预览(stopRepeating)、关相机操作(abortCaptures)等操作,这些操作都是通过下发request或者移除request实现,其中,预览request连续的,拍照的request是单一的,预览和拍照的request都会放到队列中,然后下发到camera hal。app只需通过setRepeatingRequest下发预览的request,而预览request的循环下发在/frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp的RequestThread:threadloop中完成,预览轮转buffer个数是4。

值得注意的是:拍照的优先级高于预览的优先级,如果预览的过程中收到拍照的请求,会以插队的形式将拍照的请求查到队列中。

3.5 Camera Hal回帧

Camera Hal回帧是processCaptureResult流程。processCaptureResult流程是camera hal buffer和参数回调的过程。大致流程是:其一,Camera hal将预览帧或者拍照帧的buffer填充到app配流的surface中,如果时预览帧,surface通过queen buffer形式消费buff;如果是拍照帧,拍照的buffer返回给app,app做图片保存。其二是。Camera hal将处理的预览帧和拍照帧的参数信息通过metadata返回给app。

Camera API2关键操作流程见图 3.2 。

04f4093b0650ffe4d2f34c049b343d13.jpeg

图 3.2 Camera API2关键操作流程

四、参考
https://source.android.google.cn/docs/core/camera?hl=enhuoqhuo'q

原文链接:https://blog.csdn.net/qq_37695230/article/details/131803939

参考文献:

【腾讯文档】Camera学习知识库
https://docs.qq.com/doc/DSWZ6dUlNemtUWndv

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

785bf4fb3da9ad5175e2aec291fcdc85.jpeg

点击阅读原文,为大佬点赞!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值