Android Camera2硬件接口(包)學習筆記

本文介绍了Android Camera2接口技术,包括Camera2 API的主要特点、重要类如CameraManager、CameraDevice、CameraCaptureSession和CaptureRequest的使用。Camera2提供更复杂的控制和更多特性,如曝光控制、感光度调整及Raw格式输出。通过学习资料和概念解析,阐述了如何建立CameraCaptureSession,以及如何创建和发送CaptureRequest来获取图像。
摘要由CSDN通过智能技术生成

一. Camrea2接口技術

"Android 5.0 (API Level 21)重新设计Camera,并提供了一个全新的API——Camera2。Camera2基本上和Camera(1)没什么继承性,完全是重新设计。在Camera2中Google引入了Session/Request的概念,从使用上更加复杂,同时也支持更多特性,比如可以控制曝光、控制感光度、支持Raw格式输出。当然坑也更多。"   

摘自https://www.e-learn.cn/content/qita/775532

 

二. 學習資料

Android官方文檔參考 https://developer.android.com/reference/android/hardware/camera2/package-summary (部分图片来源于此)

易學教程 https://www.e-learn.cn/content/qita/775532 (借鉴了文档组织结构)

 

三. 概念明確

Camera Device(s)

實體相機設備,即物理攝像頭,有前置攝像頭,後置攝像頭等

Surface

输出图像被用于展示的地方

四. 重要類

android.hardware.camera2.CameraManager

用來查詢,獲取,打開Camera Device,可用過Activity的方法getSystemDevice(Context.CAMERA_SERVICE)來獲取其實例

 

android.hardware.camera2.CameraDevice

相機硬件實體對應的接口類,可通過CameraManger对象使用open方法获取此类的实例。此類的一組靜態屬性描述了一個CameraDevice的信息,可用的設置,還有一些相機輸出參數

 

android.hardware.camera2. CameraCharacteristics

一個CameraDevice的具體信息。比如id號。通過此類可以設置CameraDevice的一些輸出參數(FPS,Image Size)。可以通過CameraManager的方法獲取其實例。此类通常与CameraDevice配合使用

 

android.hardware.camera2.CameraCaptureSession

建立相機會話的類。一個使用相機的常規步驟是通過CameraManager獲取到具體的CameraDevice,然後建立一個CameraCaptureSession。有了一個會話後便可向CameraDevice發送具體的請求(CameraCaptureSession)得到Image Stream(图像数据流)。此種設計模式類似與web訪問的技術。瀏覽器與服務器之間建立一個會話,然後瀏覽器發送請求就可以得到服務器的資源。面向鏈接的服務更穩定,獨立,容錯率更高。

 

android.view.Surface

android.hardware.camera2.CaptureRequest

获取图像的请求。可对传感器,镜头,闪光灯,防抖,对焦,曝光等进行配置。输出的图像被由Surface对象接收。此Surface对象被称为Target(目标)。要生成一个CameraRequest对象,使用CameraRequest.Builder类的静态方法build()来构造。而CameraRequest.Builder可由CameraDevice的createCaptureRequest方法来构造。需要注意的是,Surface对象由Builder对象管理,通过Builder的addTarget(Surface target)方法来添加。这样Builder生产出来的每个CameraRequest对象的输出地都是那个Surface对象。得到一CameraRequest对象后,就可以将其传给一个CameraCaptureSession会话了。具体操作是调用会话的setRepeatingRequest方法(请求连续的图像,通常用来做预览功能)或capture方法(请求一帧图像,通常用来做照相功能),具体参见API文档。

五. 简易抽象结构概览

 

六. 嵌套类的回调方法(Callback)

CameraDevice.StateCallback

使用CameraManager的openCamera方法需要传入一个此嵌套类的对象。

 

openCamera原型(重载方法未列出)

openCamera打开由cameraId指定的CameraDevice,然后根据打开的结果来回调callback中的函数。

 

CameraDevice.StateCallback的四个抽象方法

需要实现此静态抽象类并重写四个抽象方法,通过他们的方法名能轻易得知该方法在何时会被回调。可以按照自己的实现逻辑在不同的回调方法中编写代码

 

CameraCaptureSession.StateCallback

使用CameraDevice创建一个捕捉会话(createCaptureSession)需要传入一个此类的对象

createCaptureSession原型

该方法在CameraDevice中是抽象的,推测使用CameraManager的openCamera方法传回的CameraDevice是其子类,已重写此方法,有兴趣者可查看源代码一探究竟

 

CameraCaptureSession.StateCallback要求实现onConfigured方法与onConfigureFailed方法

可在onConfigured()中得到创建成功的CameraCapureSession实例,然后编写你的逻辑代码。比如在方法内部设置请求,立即开始拍照或预览等

 

CameraCaptureSession.CaptureCallback

这不是一个非得被传入的回调嵌套类。其回调方法皆未被申明为abstract。这意味着你可以创建一个匿名内部类但不用实现任何方法。该对象可以在CameraCaptureSession的setRepeatingRequest方法(其他可接受此类型对象的方法见下图)中被传入,你也可以用null代替。

关于此类的详情参见 https://developer.android.com/reference/android/hardware/camera2/CameraCaptureSession.CaptureCallback.html

 

七. 预览实例

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值