AndroidCamera详解一:Camera2整体架构介绍

一篇关于Android Camera2系统的架构介绍,后续我们再深入吧~
Views: 94
1 0
Read Time:43 Second

做了一段时间的EVS架构,整体流程已经比较熟悉了。但是安卓上针对摄像头的应用除了EVS架构外,还有另外一套更为复杂的Camera架构,与EVS架构不同,安卓Camera2架构的应用场景更加广泛,也更加贴近日常应用。所以最近抽出了一些时间来学习这套架构,一边学习一边总结,并将其作为一个系列记录在此。

在正式开始之前,简单讲讲EVS架构与Camera架构的整体区别。从架构层次上来讲,EVS架构的应用实现在Framework(C++)层,而Camera的应用实现则是在应用层。由于整体层次偏低,使得EVS架构具有更快的响应速度。在某些要求快速启动的场景下(如快速倒车等),EVS架构具有天然的优势。当然,EVS的缺点也很明显,由于层次较低,导致无法充分利用Android系统的便利性,导致基于EVS架构的应用在实现复杂的UI界面上会比较头疼,同时EVS架构也无法支撑更为复杂的摄像头应用,如闪光灯、参数调节等特性EVS架构是不支持的。这就是两种摄像头应用架构的不同。

简单对比了EVS架构与Camera架构的优劣点后,我们来了解一下Camera2的整体架构。

关于Android Camera2的整体介绍,可以参考谷歌官方介绍文档。这里暂且就将官方的架构图贴在这里。

针对这个架构图,我们简单理解一下:

1)Java Applicaiton:应用层上是各个独立的App,无论是Activity也好还是Service也好,向下需要接入CameraManager,通过CameraManager接入CameraService。

2)Framework(Java):这一层就是CameraManager整体实现的地方,源码路径位于framworks/base/core/java/android/hardware/camera2目录下。源码中比较重要的重要的类列举如下:

CameraManager.java:CameraMnager类作为应用APP连接到Camera服务的入口,用于检测、配置以及连接到CameraDevice,在CameraManager启动时,其会使用camera字段作为context注册到Binder内,应用想要连接到CameraManager时,通过getSystemService传入该字段即可。

CameraDevice.java:CameraDevice类是连接到安卓系统的摄像头设备在Java层的实列代表,为应用提供针对具体摄像头设备的管理,每个独立的CameraDevice将以CameraId做为区分。

CameraCaptureSession.java:CameraCaptureSession类是针对某个具体的CameraDevice捕获内容的管理对象,同一个CameraDevice可以有多个CameraCaptureSession.创建CaptrueSession时需要传入相应的Surface界面,调用方将获得与该Surface对应的一个StramId.

CameraCaptureRequest.java:CameraCaptureRequest类用于在创建完CamerCaptureSession后针对图像输出特定格式的管理。在创建CaptureRequest时需要传入模板类型以表明应用类型。目前支持的模板包括TEMPLATE_PREVIEW,TEMPLATE_STILL_CAPTURE,TEMPLATE_RECORD以及TEMPLATE_VIDEO_SNAPSHOT,TEMPLATE_ZERO_SHUTTER_LAG,TEMPLATE_MANUAL.

3 )AIDL:CameraManager需要连接到Framework Native层的CameraService,连接的桥梁就是通过AIDL所定义的Binder通信接口。Camera2所定义的AIDL接口位于frameworks/av/camera/aidl/android/hardware文件夹内。

4 )Framework(C++):Camera2架构的核心就是位于Native层的CameraService,其代码目录位于frameworks/av/camera文件夹下。在这一层,主要分为两部分,一部分是camera server,作为cameraservice启动的入口,还包含了rc启动引导文件.另一部分则是libcameraservice,经系统编译后会生成libcameraservice.so库,由camera server进行加载启动。

5)HAL:CameraService并不能直接与驱动进行交互,需要通过HAL层的Camera Hal完成对摄像头的具体管理行为。与CameraManager连接CameraService类似,CameraService将通过Binder通信调用Camera Hal的接口,这部分的接口定义hidl文件位于hardware/interfaces/camera/内。

以上就是Android系统Camera2架构的一个简单介绍了,总体来说Camera2这套架构还是相当复杂的,今天的这篇文章先只做架构介绍,后续我们再慢慢深入进行补充吧~

Happy
Happy
100 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
默认图片
FranzKafka95
极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。
文章: 45

留下评论

zh_CNCN