美文网首页
Android Camera API2架构和流程介绍

Android Camera API2架构和流程介绍

作者: 程序员Android1 | 来源:发表于2023-11-22 12:56 被阅读0次

    和你一起终身学习,这里是程序员 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整体软件架构。


    图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 操作流程

    图 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 。


    图 3.2 Camera API2关键操作流程

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

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

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

    相关文章

      网友评论

          本文标题:Android Camera API2架构和流程介绍

          本文链接:https://www.haomeiwen.com/subject/yeaiwdtx.html