Android Camera2启动与预览

概述

google在android5.0(Lollipop)开始对Camera的架构进行了调整,废弃了Camera API1接口。使用Camera API2把相机设备当成一个流水线。每一个请求都可以从获取相机设备获取一张的图像。这种request、response模式其实就是CS架构,事实上底层是实现了CameraDeviceClient.

CameraManager

操作相机需要一个CameraManager实例,它其实是一个系统服务,通过context.getSystemService(Context.CAMERA_SERVICE)可以获取。其提供一些描述相机的属性信息,例如系统支持的相机个数列表getCameraIdList()和单个相机特性getCameraCharacteristics(cameraId)。当然也可以调用openCamera(cameraId,stateCallback,handler)打开相机。

CameraDevice

CameraDevice可以表示一个打开的相机设备, CameraDevice.StateCallbackonOpened回调返回此实例对象。

CreateCaptureSession

想从相机设备中获取Image,应用要创建一个camera capture session 把接收数据的载体传给相机设备,目前能接收相机数据的载体是Surface和SurfaceTexture。其中它们的size和format需要和相机支持的匹配。SurfaceView、TextureView、MediaCodec、MediaRecorder、Allocation、ImageReader都提供接收相机数据的载体。

通过情况下,相机的预览数据可以使用SurfaceView和TextureView接收。拍照使用ImageReader、录视频使用MediaCodec或MediaRecorder。

CaptureRequest

应用需要创建一个CaptureRequest向相机申请设置参数。通过调用CameraCaptureSessionsetRepeatingRequest接口实现。



Camera API2架构图

image

由图可知,Java层要想与C++层的CameraService层进行通信,都是通过Java层的IPC Binder进制进行的,主要包括ICameraService.aidl以及ICameraDeviceUser.aidl两个接口来实现,其会在Java层维护一个CameraDeviceImpl即Camera设备的代理,而CameraService以及CameraDeviceImpl的初始化会在此文的第二,第三节进行分析。而Java层对Camera的具体操作的操作流程大致为,Java层通过Device代理发送一个CaptureRequest,而C++层进行相应的处理,再调用相应的回调来通知Java相应的处理结果,并将相应的Capture数据保存在Surface Buffer里,这样Java层在回调函数中可以对数据进行相应的处理。而对于具体操作流程的分析,请参考文章开始时的Camera2相关文章的连接。

你可能感兴趣的:(Android Camera2启动与预览)