Camera2知识点复习笔记

1.CameraManager
相机的管理者:检测、描述、连接到相机设备。
(1)getCameraIdList():返回String[] ,当前连接的相机设备的id列表,包括可能被其他相机API客户端使用的相机。
注:此列表不包含只能用作逻辑多摄像头设备一部分的物理摄像头。
会抛出的异常:
CameraAccessException:如果CameraManager无法查询或打开相机设备,或者与打开的CameraDevice的连接不再有效,则会引发。
(2)getCameraCharacteristics(String cameraId): 返回CameraCharacteristics ,查询摄像机设备的功能。
会抛出的异常:
如果摄像头ID与任何已知的摄像头设备不匹配,则为IllegalArgumentException。
如果相机设备已断开连接,则CameraAccessException。
(3)openCamera(String cameraId,cameraDevice.StateCallback callback,Handler handler),打开给定Id的摄像头的连接。第一个参数指示打开哪个摄像头, 第二个参数stateCallback为相机的状态回调接口,第三个参数用来确定Callback在哪个线程执行,为null的话就在当前线程执行。
在同一应用程序中打开同一摄像头ID两次,同样会触发断开连接CameraDevice.StateCallback.onDisconnected(CameraDevice)的回调,并删除所有正在进行的任务。
如果设备断开连接,或者如果更高优先级的camera API客户端开始使用相机设备,则open可能会失败。如果打开相机设备失败,则将调用设备回调的onError方法,随后对相机设备的调用将抛出CameraAccessException。
会抛出的异常:
CameraAccessException 如果相机被设备策略禁用、已断开连接、正由更高优先级的相机API客户端使用,或者设备已达到其最大资源,并且无法打开此相机设备。
IllegalArgumentException 如果cameraId或回调为null,或者cameraId与getCameraIdList()返回的任何当前或以前可用的相机设备不匹配。
SecurityException 如果应用程序没有访问摄像头的权限,则出现SecurityException
注:openCamera可以直接打开的独立摄像机ID,但用作逻辑多摄像机一部分的物理摄像机ID无法打开。
(4)openCamera (String cameraId, Executor executor, CameraDevice.StateCallback callback) :第二个参数:回调和侦听器事件通过该执行器进行调度,提供了一种控制使用哪个线程的简单方法。要通过应用程序的主线程分派事件,可以使用Context.getMainExecutor()。
会抛出的异常:
CameraAccessException
IllegalArgumentException 如果cameraId、回调或执行器为空,或者cameraId与任何当前或以前可用的相机设备不匹配。
SecurityException
(5)setTorchMode(String cameraId,boolean enabled),在不打开相机的情况下设置闪光灯的模式。

2.CameraDevice
一个连接安卓设备的单一摄像头的代表,可以在高帧率下对图像捕捉和后期处理进行精确控制。
一个给定的相机设备可以提供两个级别的支持:有限的或完全的。有限的支持可能不支持Camera2API,所以在应用摄像头后,最好先获取权限级别,如果应用程序需要一个全支持的操作,那么在Manifest声明“android.hardware.camera.level.full”的特征。
(1)createCaptureRequest(int):创建一个CaptureRequest.Builder
参数:

TEMPLATE_MANUAL一个用于直接应用控制捕获参数的基本模板。
TEMPLATE_PREVIEW创建一个适合于相机预览窗口的请求。
TEMPLATE_RECORD创建一个适合于视频录制的请求。
TEMPLATE_STILL_CAPTURE创建一个适合于静态图像捕获的请求。
TEMPLATE_ZERO_SHUTTER_LAG创建一个适用于零快门延迟的请求。
TEMPLATE_VIDEO_SNAPSHOT在录制视频时创建一个适合静态图像捕捉的请求。

(2)close():尽可能快地关闭与这个相机设备的连接。
(3)createCaptureSession(List outputs, CameraCaptureSession.StateCallback callback, Handler handler)😕/创建相机捕获会话, 第一个参数是捕获数据的输出Surface列表, 第二个参数用于监听 Session 状态的CameraCaptureSession.StateCallback对象,是CameraCaptureSession的状态回调接口,当它创建好后会回调onConfigured方法,第三个参数用来确定Callback在哪个线程执行,为null的话就在当前线程执行(用于执行 CameraCaptureSession.StateCallback 的 Handler 对象,可以是异步线程的 Handler,也可以是主线程的 Handler)

会抛出的异常:
IllegalArgumentException 如果输出Surface不满足要求,则回调为null,或者handler为null,但当前线程没有looper。
CameraAccessException 如果相机设备不再连接或遇到致命错误
IllegalStateException如果相机设备已关闭
(4)getId():获取相机设备的ID,string类型
CameraDevice.StateCallback

onClosed(CameraDevice camera)当一个相机设备CameraDevice的close()方法时,这个方法就被调用
onDisconnected(CameraDevice camera)当相机设备不再可用时,这个方法就被调用
onError(CameraDevice camera, int error)当相机设备遇到严重错误时,这种方法就被调用了,错误见上表的常量
onOpened(CameraDevice camera)当相机完成打开操作后,这个方法就被调用

3.CameraCaptureSession
用于捕获相机的照片,一旦创建CameraCaptureSession,这个会话就会处于活动状态,除非相机又新建一个会话或者设备关闭。创建一个会话需要零点几秒的时间,因为它需要配置摄像机设备的内部管道,并分配内存缓冲区,以将图像发送到所需的目标。
(1)capture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler),提交一个图像请求,以便被摄像机设备捕捉到。
(2)close(),异步关闭这个捕获会话。
(3)getDevice(),获取这个会话创建的摄像机设备。
(4)setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler),请求不断地重复捕捉这个捕获会话的图像。
(5)stopRepeating(),取消重复捕捉请求
CameraCaptureSession.CaptureCallback
用于跟踪向相机提交CaptureRequest对象的进程,是在一个请求触发一个捕获开始时调用的(capture())

onCaptureBufferLost(CameraCaptureSession session, CaptureRequest request, Surface target, long frameNumber)如果捕获的单个缓冲区不能发送到它的目标Surface,就会调用该方法。
onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)当一个图像捕捉已经完全完成并且所有的结果数据都可用时,这个方法就会被调用。
onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure)当相机不能向 CaptureResult 对象提供请求,就会调用。
onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult)当图像捕捉取得部分进展时,就会调用该方法;有些(但不是全部)从图像捕获中得到的结果是可用的。
onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId)这个方法独立于CaptureCallback中的其他方法,当捕获序列在任何CaptureResult或capture失败之前通过这个侦听器返回时。
onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber)这个方法独立于CaptureCallback中的其他方法,当捕获序列完成后,通过这个侦听器返回所有的CaptureResult或capture失败。
onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber)当摄像机设备开始捕捉请求的输出图像,在图像曝光开始时,或者当摄像机设备开始处理一个重新处理请求的输入图像时,这个方法就被调用了。

CameraCaptureSession.StateCallback

createCaptureSession()回调中用于接收关于相机捕捉会话状态的更新。
onActive(CameraCaptureSession session)当会话开始主动处理捕获请求时,将调用此方法。
onCaptureQueueEmpty(CameraCaptureSession session)当摄像机设备的输入捕捉队列变为空时,该方法将被调用,并准备接受下一个请求。
onClosed(CameraCaptureSession session)会话关闭触发
onConfigureFailed(CameraCaptureSession session)如果会话不能按照请求配置,则调用此方法。
onConfigured(CameraCaptureSession session)当摄像机设备完成配置时,这个方法就会被调用,会话可以开始处理捕获请求。
onReady(CameraCaptureSession session)每当会话不再需要处理请求时,就会调用此方法。
onSurfacePrepared(CameraCaptureSession session, Surface surface)当输出表的缓冲区预分配完成时,就会调用该方法。

CameraCharacteristics
描述摄像头设备的属性。
CameraManager的getCameraCharacteristics(String cameraId) 方法获取单个摄像头的CameraCharacteristics对象

CaptureRequest.Builder
捕获请求的构建器。
使用CameraDeviced的createCaptureRequest(int)方法获取
addTarget(Surface outputTarget) 向该请求的目标列表添加一个Surface。
build()构建CaptureRequest。
removeTarget(Surface outputTarget)从这个请求的目标列表中删除一个Surface。
set(Key key, T value) 设置各种参数,比如自动对焦,设置闪光灯。
setTag(Object tag) 为这个请求设置一个标记。

ImageReader
ImageReader类允许应用程序直接将图片数据渲染到Surface上 。
(1)acquireLatestImage() 从ImageReader的队列中获取最新的图像,删除较旧的Image
(2)acquireNextImage() 从ImageReader队列获取下一个图像
(3)close() 释放与此ImageReader相关的所有资源。
(4)getHeight() 图像的默认高度,以像素为单位
(5)getImageFormat() 图像的默认图像格式。
(6)getMaxImages() 从ImageReader获得的最大数量的图像
(7)getSurface() 获得一个可以用来为这个ImageReader生成图像的Surface
(8)getWidth() 图像的默认宽度,以像素为单位
(9)newInstance(int width, int height, int format, int maxImages) 为想要的大小和格式创建一个新的对象
(10)setOnImageAvailableListener(ImageReader.OnImageAvailableListener listener, Handler handler) 当一个新映像从ImageReader可用时,注册一个侦听器将被调用。
预览流程
在这里插入图片描述拍照流程
在这里插入图片描述

录像流程
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值