深入理解相机体系 三 相机应用层 APP

03126e14bc922b54dd948d3a1f9598a3.gif

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

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

一、概览
二、Camera Api v2
三、Camera Framework
四、Camera App Demo

相机应用层

一、概览

相机应用处于整个框架的上层,在现实生活中,为了满足各式各样的应用场景,会加入很多业务处理逻辑,但是一旦当我们拨开繁杂的业务逻辑,便会发现其核心部分依然是通过调用谷歌制订的一系列Camera Api接口来完成的,而所有的相机行为都包含在该接口中。

起初,相机系统采用的是Camera Api v1接口,它通过一个Camera 类以及该类中的几个标准方法来实现整个相机系统的预览、拍照以及录像功能,控制逻辑比较简单,同时也比较容易理解,但也正是这种简单,导致了它无法逐帧控制底层硬件,无法通过元数据进行修改进而增强帧的表达能力,再加之应用场景的多样化趋势,该接口在新功能的实现上显得些许力不从心。面对该接口难以进一步扩展相机功能这一局面,谷歌在Andorid 5.0(API Level 21)便重新对Camera进行了设计,摒弃了Camera Api v1的设计逻辑,提出了一个全新的API – camera2,引入了Session以及Request概念,将控制逻辑统一成一个视图,因此在使用上更加复杂,同时也支持了更多特性,比如逐帧控制曝光、感光度以及支持Raw格式的输出等。并且由于对控制逻辑的高度抽象化,使得该接口具有很高的灵活性,可以通过简单的操作实现30fps的全高清连拍的功能,总得来说,该接口极大地提高了对于相机框架的控制能力,同时也进一步大幅度提升了其整体性能。

谷歌提出Camera Api v2接口的同时,将其具体实现放入了Camera Framework中来完成,Framework内部负责解析来自App的请求,并且通过AIDL跨进程接口下发到Camera Service中进行处理,并且等待结果的回传。接下来我们首先以Camera Api v2接口为主简单讲解下其逻辑含义,然后详细梳理下Camera Framework对于它的实现,最后以一个简单App Demo为例,来介绍下如何使用该接口来控制整个相机体系。

8e9c01d037d6647fa62504eb293243a6.png

image

二、Camera Api v2

在介绍Camera Api v2之前,首先我们来回顾下Api v1接口的基本逻辑,该接口主要通过一个Camera.java类来定义了所有的控制行为,通过定义诸如open、startPreview、takePicture、AutoFocus等标准的接口来实现打开设备、预览、拍照以及对焦操作的功能,同时通过定义Camera.Parameters来实现了参数的读取与设置,其中包括了帧率、图片格式的控制,另外,通过定义了Camera.CameraInfo来实现了图像元数据的获取。而为了更加细致化地控制相机系统的Camera Api v2接口,相对于Api v1接口而言,复杂了许多,通过不同的接口类以及接口方法定义了复杂的相机系统行为,接下来我们来逐一进行介绍:

CameraManager
谷歌将CameraManager定义为一个系统服务,通过Context.getSystemService来获取,主要用于检测以及打开系统相机,其中打开操作通过openCamera方法来完成。除此之外,还定义了getCameraCharacteristics方法来获取当前Camera 设备支持的属性信息,而该属性信息通过CameraCharacteristics来表示,其中包括了图像数据的大小以及帧率等信息。

CameraDevice
代表了一个被打开的系统相机,类似于Camera Api v1中的Camera类,用于创建CameraCaptureSession以及对于最后相机资源的释放。

CameraDevice.StateCallback
该类定义了一系列的回调方法,其实现交由App来完成,主要用于返回创建Camera设备的结果,一旦创建成功相机框架会通过回调其onOpened方法将CameraDevice实例给到App,如果失败,则调用onError返回错误信息。

CameraCaptureSession
该类代表了一个具体的相机会话,建立了与Camera设备的通道,而之后对于Camera 设备的控制都是通过该通道来完成的。当需要进行预览或者拍照时,首先通过该类创建一个Session,并且调用其startRepeatingRequest方法开启预览流程,或者调用capture方法开始一次拍照动作。

CameraCaptureSession.StateCallback
该接口类定义了一系列回调方法,其实现交由App完成,主要用于返回创建CameraCaptureSession的结果,成功则通过onConfigured方法返回一个CameraCaptureSession实例,如果失败则通过onConfigureFailed返回错误信息。

CameraCaptureSession.CaptureCallback
该接口类定义了一系列回调方法,用于返回来自Camera Framework的数据和事件,其中onCaptureStarted方法在下发图像需求之后立即被调用,告知App此次图像需求已经收到,onCaptureProgressed方法在产生partial meta data的时候回调,onCaptureCompleted方法在图像采集完成,上传meta data数据时被调用。

CaptureRequest
该类用于表示一次图像请求,在需要进行预览或者拍照时,都需要创建一个CaptureRequest,并且将针对图片的一系列诸如曝光/对焦设置参数都加入到该Request中,通过CameraCaptureSessin下发到相机系统中。

TotalCaptureResult
每当通过CameraDevice完成了一次CaptureRequest之后会生成一个TotalCaptureResult对象,该对象包含了此次抓取动作所产生的所有信息,其中包括关于硬件模块(包括Sensor/lens/flash)的配置信息以及相机设备的状态信息等。

CaptureResult
该类代表了某次抓取动作最终生成的图像信息,其中包括了此次关于硬件软件的配置信息以及输出的图像数据,以及显示了当前Camera设备的状态的元数据(meta data),该类并不保证拥有所有的图像信息。

三、Camera Framework

基于接口与实现相分离的基本设计原则,谷歌通过Camera Api 接口的定义,搭建起了App与相机系统的桥梁,而具体实现便是由Camera Framework来负责完成的。在采用Camera Api v1接口的时期,该部分是通过JNI层来进行java到C++的转换,进而到达native层,而在native层会通过实现CameraClient建立与Camera Service的通讯 ,整个过程比较繁琐,使得整体框架略显繁杂,而随着Camera Api v2的提出,在该层便大量使用AIDL机制,直接在Java层建立与Camera Service的通信,进一步简化了整体框架。,接下来我们以几个主要接口为主线,简单梳理下其具体实现。

af7d93441deadaa1b5f19f1d3a18ce1c.png

在这里插入图片描述

CameraManager
实现主要在CameraManager.java中,通过CameraManager查询、获取以及打开一个Camera 设备。在该类中还实现了内部类CameraManagerGlobal,该类继承于ICameraServiceListener.Stub,在打开相机设备的时候,在内部会获取到ICameraService远程代理,并且调用ICameraService的addListener方法将自己注册到Camera Service中,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值