摄像头拍照
文章目录
-
- 摄像头拍照
-
- 1、Camera1使用
- 2、 Camera2拍照流程图:
-
- 2.1 CameraManager
- 2.2 CameraCharacteristics
- 2.3 CameraDevice
- 2.4 CameraDevice.StateCallback
- 2.5 CameraRequest和CameraRequest.Builder
- 2.6 CaptureRequest.Builder(内部类)
- 2.7 CaptureRequest.Key(内部类)
- 2.8 CameraCaptureSession
- 2.9 CameraCaptureSession.CaptureCallback
- 2.10 CameraCaptureSession.StateCallback
- 2.11 CaptureResult
- 2.12 ImageReader
- 2.13 TextureView 和SurfaceView
- 3 、Camera框架实现录像
- 4 、屏幕捕捉
从 Android 5.0 开始,Google 引入了一套全新的相机框架 Camera2(android.hardware.camera2)并且废弃了旧的相机框架 Camera1(android.hardware.Camera)
1、Camera1使用
1.1 使用步骤:
- 调用Camera.open(),打开相机,默认为后置,可以根据摄像头ID来指定打开前置还是后置
- 调用Camera.getParameters ()得到一个Camera.Parameters对象
- 使用步骤2得到的Camera.Parameters对象,对拍照参数进行设置
- 调用Camera.setPreviewDispaly(SurfaceHolder holder),指定使用哪个SurfaceView来显示预览图片
- 调用Camera.startPreview()方法开始预览取景
- 调用Camera.takePicture()方法进行拍照
- 拍照结束后,调用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拍照流程图:
-
调用 CameraManager的openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) 方法打开指定摄像头。该方法的第一个参数cameraId代表要打开的摄像头ID(摄像头ID(通常0代表后置摄像头,1代表前置摄像头);第二个参数用于监听摄像头的状态;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。
-
获取CameraDevice对象
当摄像头被打开之后,程序即可获取CameraDevice—即根据摄像头ID获取了指定摄像头设备,然后调用CameraDevice的createCaptureSession(List outputs, CameraCaptureSession. StateCallback callback,Handler handler)方法来创建CameraCaptureSession。该方法的第一个参数是一个List集合,封装了所有需要从该摄像头获取图片的Surface,第二个参数用于监听CameraCaptureSession的创建过程;第三个参数代表执行callback的Handler,如果程序希望直接在当前线程中执行callback,则可将handler参数设为null。 -
设置设置摄像头模式
不管预览还是拍照,程序都调用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操作线程池