多媒体应用开发-控制摄像头拍照

本文详细介绍了Android中使用Camera2 API进行拍照应用开发的过程,包括Camera1与Camera2的区别、Camera2的新特性、Camera2的架构概述、主要类及方法的使用。通过CameraManager打开摄像头,创建CameraCaptureSession,设置CaptureRequest参数,实现拍照功能。此外,还提及了Camera2在录像和屏幕捕捉方面的作用。
摘要由CSDN通过智能技术生成

摄像头拍照


从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2)并且废弃了旧的相机框架 Camera1(android.hardware.Camera)

1、Camera1使用

1.1 使用步骤:
  1. 调用Camera.open(),打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置
  2. 调用Camera.getParameters ()得到一个Camera.Parameters对象
  3. 使用步骤2得到的Camera.Parameters对象,对拍照参数进行设置
  4. 调用Camera.setPreviewDispaly(SurfaceHolder holder),指定使用哪个SurfaceView来显示预览图片
  5. 调用Camera.startPreview()方法开始预览取景
  6. 调用Camera.takePicture()方法进行拍照
  7. 拍照结束后,调用Camera.stopPreview()结束取景预览,之后再replease()方法释放资
1.2 为什么要使用Camera2

通过 Camera2 提供的高级特性可以构建出更加高质量的相机应用程序。

​ 1.在开启相机之前检查相机信息

​ 2.在不开启预览的情况下拍照

​ 3.一次拍摄多张不同格式和尺寸的图片

​ 4.控制曝光时间

​ 5.连拍

1.3 Camera2的 5点新特性:

(1)支持30帧的高清连拍功能。

(2)支持每帧之间的手动设置。

(3)支持RAW原始图像的拍摄。

(4)支持快门零延迟以及电影速拍。

(5)支持相机其它方面的手动控制,包括噪音消除。

1.4 Camera2架构概述

在这里插入图片描述

Camera2引用了管道的概念,将Camera Device相机设备和Android Device安卓设备连接起来,android Device通过管道发送CaputerRequest拍照请求给Camera Device,Camera Device通过管道返回CameraMetaData数据给Android Device,这一切建立在一个叫做CameraCaptureSession。

1.5 Camera2中比较重要的类及方法

在这里插入图片描述

其中CameraManager是所有相机设备(CameraDevice)的管理者,而每个CameraDevice自己会负责建立CameraCaptureSession以及建立CaptureRequest。

CameraCharacteristics是CameraDevice的属性描述类,在CameraCharacteristics中可以进行相机设备功能的详细设定(当然了,首先你得确定你的相机设备支持这些功能才行)。

类图中有着三个重要的callback,其中CameraCaptureSession.CaptureCallback将处理预览和拍照图片的工作,需要重点对待

2、 Camera2拍照流程图:

在这里插入图片描述

  1. 调用 CameraManager的openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) 方法打开指定摄像头。该方法的第一个参数cameraId代表要打开的摄像头ID(摄像头ID(通常0代表后置摄像头,1代表前置摄像头);第二个参数用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

  2. 获取CameraDevice对象
    当摄像头被打开之后,程序即可获取CameraDevice—即根据摄像头ID获取了指定摄像头设备,然后调用CameraDevice的createCaptureSession(List outputs, CameraCaptureSession. StateCallback callback,Handler handler)方法来创建CameraCaptureSession。该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface,第二个参数用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。

  3. 设置设置摄像头模式

不管预览还是拍照,程序都调用CameraDevice的createCaptureRequest(int templateType)方法创建CaptureRequest.Builder,该方法支持TEMPLATE_PREVIEW(预览)、TEMPLATE_RECORD(拍摄视频)、TEMPLATE_STILL_CAPTURE(拍照)等参数。

通过第3步所调用方法返回的CaptureRequest.Builder设置拍照的各种参数,比如对焦模式、曝光模式等。

调用CaptureRequest.Builder的build()方法即可得到CaptureRequest对象,接下来程序可通过CameraCaptureSession的setRepeatingRequest()方法开始预览,或调用capture()方法拍照。

2.1 CameraManager

管理所有的摄像头(CameraDevice)设备的管理者,用于打开和关闭系统摄像头。

获取该实例的方法:

CameraManager manager =(CameraManager)Context.getSystemService(Context.CAMERA_SERVICE);

或者

CameraManager manager =(CameraManager)Context.getSystemService(CameraManager.class);
  • getCameraIdList() :返回当前设备中可用的相机列表, 这个 id 通常都是从 0 开始并依次递增的

  • public CameraCharacteristics getCameraCharacteristics (String cameraId) :根据摄像头id返回该摄像头的相关信息;cameraId,0为后置摄像头、1为前置摄像头

  • public void openCamera(String cameraId,final CameraDevice.StateCallback callback, Handler handler)

  • public void openCamera(String cameraId,Executor executor,final CameraDevice.StateCallback callback)都是打开指定cameraId的相机,只是一个传入Handler,一个传入Executor,是想用线程池来执行Camera中耗时操作

😄 cameraId 是一个标识,标识当前要打开的camera

😆 callback 是一个状态回调,当前camera被打开的时候,这个状态回调会被触发的。

😃 handler 指定回调执行的线程。传 null 时默认使用当前线程的 Looper,我们通常创建一个后台线程来处理。

😚 executor操作线程池

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值