android.hardware.camera2软件包为连接到Android设备的各个相机设备提供了一个界面。 它取代了已弃用的Camera类。
该软件包将相机设备建模为流水线,该流水线接收输入请求以捕获单个帧,根据请求捕获单个图像,然后输出一个捕获结果元数据包以及一组用于请求的输出图像缓冲区。 这些请求按顺序处理,并且多个请求可以一次在飞行中。 由于摄像设备是一个具有多个阶段的流水线,因此在大多数Android设备上都需要有多个请求。
要枚举,查询和打开可用的相机设备,请获取 CameraManager实例。
个体CameraDevices提供一组静态属性信息,用于描述设备的硬件设备以及可用设置和输出参数。 此信息通过CameraCharacteristics对象提供,可通过getCameraCharacteristics(String)
要从摄像头设备捕捉或传输图像,应用程序必须首先创建一个带有一组输出表面的camera capture session ,以便与摄像头设备一起使用,并带有createCaptureSession(List
。 每个Surface必须预先配置appropriate size and format (如果适用)以匹配相机设备提供的尺寸和格式。 目标表面可以从各种类来获得,包括SurfaceView , SurfaceTexture经由Surface(SurfaceTexture) , MediaCodec , MediaRecorder , Allocation ,和ImageReader 。
通常,相机预览图像将发送到SurfaceView或TextureView (通过其SurfaceTexture )。 JPEG图像或RAW缓冲区来捕获DngCreator是可以做到ImageReader与JPEG种RAW_SENSOR格式。 ,或直接在管理或本机代码在的renderScript,OpenGL ES的相机数据的应用驱动的处理最好是通过做Allocation用YUV Type , SurfaceTexture和ImageReader与YUV_420_888分别格式。
然后,应用程序需要构建一个CaptureRequest ,它定义摄像头设备捕获单个图像所需的所有捕获参数。 该请求还列出了应将哪个配置的输出曲面用作此捕捉的目标。 CameraDevice有一个factory method用于为给定用例创建一个request builder ,该用例针对运行该应用程序的Android设备进行了优化。
一旦请求建立起来,就可以将它交给主动捕获会话,以便进行一次性capture或无限repeating使用repeating 。 两种方法都有一个变种,它接受用作突发捕获/重复突发的请求列表。 重复请求的优先级低于捕获的优先级,因此在重新配置了重复请求时通过capture()提交的请求将在任何新的当前重复(突发)捕获实例开始捕获之前捕获。
处理请求后,相机设备将产生一个TotalCaptureResult对象,其中包含在捕获的时间大约摄像机装置的状态的信息,和所使用的最终设置。 如果四舍五入或解决矛盾的参数是必要的,这些可能与请求有所不同。 相机设备也会将一帧图像数据发送到请求中包含的每个输出Surfaces 。 这些是相对于输出CaptureResult异步生成的,有时会在相当晚的时候生成。
| CameraAccessException | 如果 |