Camera api2完成预览、拍照录像的流程讲解

目录

1、Camera api2中的主要的类

2、预览的流程

2.1 预览流程图

2.2 预览流程详解

3、拍照的流程

3.1 拍照流程图

3.2 拍照流程详解

4、录像

4.1 录像流程图

4.2 录像流程详解


1、Camera api2中的主要的类

CameraManager:用于检测,表征和连接到CameraDevice的系统服务管理器

CameraManager manager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE)可以用于获取系统相机资源

Manager.getCameraCharacteristics(String cameraID)可用于获取指定相机特性,返回一个CameraCharacteristics类

 

CameraDevice:连接到Android设备的单个摄像头的表示,描述一个照相机设备,一个Android设备可能会有多个摄像头,通过CameraId可以进行区别,当相机状态回调函数执行的时候,可以从回调中拿到当前CameraDevice,并通过CameraDevice对当前相机进行一些列操作

 

CameraCharacteristics描述一个摄像头的特性。该对象通过CameraManager来获取,用于描述特定摄像头所支持的各种特性,通过get方法,以key-value的形式获取,例如获取某个Camera的sensor的方向:

CameraCharacteristics characteristics = CamerageManager.getCameraCharacteristics(CameraId)

mSensorOrientation = characteristic.get(CamerageCharacteristics.SENSOR_ORIENTATION)

 

CameraCaptureSession一个对于CameraDevice的捕获会话,用于从相机中捕获图像,或者重新处理先前在同一会话中从相机中捕获的图像。

当程序需要预览、拍照时,都需要先通过该类的实例创建Session。该类可控制拍照和预览,控制预览的方法为setRepeatingRequest();控制拍照的方法为capture(),为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera API2为CameraCaptureSession提供了StateCallback、CaptureCallback等内部类

 

CameraRequest:从相机设备捕获单个图像所需的不可变的设置和输出报,当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CameraRequest参数。CameraRequest.Builder则负责生成CameraRequest对象

如:预览前设置自动对焦

CaptureRequestBuilder.set(CaptureRequest.CONTORL_AF_MODE,CaptureRequest.CONTROL_AF_MOODE_CONTINUOUS_PICTURE);

CaptureRequest = CaptureRequestBuilder.build();

CameraCaptureSession.setRepeatingRequest(CaptureRequest,CaptureCallback,Handler);

 

CameraMetadata相机控件和信息的基类,此类定义用于查询下相机特性或捕获结果以及相机请求参数的key-value

 

2、预览的流程

2.1 预览流程图

Camera api2完成预览、拍照录像的流程讲解_第1张图片

2.2 预览流程详解

1、首先由CameraManager.openCamera方法,打开摄像头,该方法传入三个参数:

·String CameraId:传入要打开的摄像头的Id

·CameraDevice.stateCallback:即CameraDevice.stateCallback的实例

·Handler:为一个句柄,代表执行callback的handler,如果程序希望直接在当前线程中执行callback,则可以将handler参数设为null

2、实例化CameraDevice.statCallback,并重写onOpened方法,该方法在摄像头完成打开动作后调用,以下动作均在onOpened方法中完成,onOpened方法,会返回当前使用的CameraDevice

3、调用CameraDevice.CreateCapture(int templateType)创建一个CaptureRequest.Builder,templateType来区分是拍照还是预览,当预览时,我们传入CameraDevice.TEMPLATE_PREVIEW参数,该方法回返回一个对于返回的对象,我们声明一个CaptureRequest.Builder类型的mCaptureRequestBuilder变量来接收

4、调用mCaptureRequestBuilder.addTarget()方法,将显示预览用的surface的实例传入,即将显示预览用的surface的实例,作为一个显示层添加到该请求的目标列表中

5、调用CameraDevice.CreateCaptureSession()方法,该方法传入三个参数:

·List:可用于捕获目标图像数据的Surface集合,此处传入用于显示预览图像的Surface即可,即Arrays.asList(surface)

·CameraCaptureSession.stateCallback:该回调的实例

·Handler:一个句柄,代表执行callback的handler,如果程序希望在当前线程执行callback,可以将Handler参数设为null

6、实例化CameraCaptureSession.stateCallback,并重写onConfigured方法,该方法在摄像头设备完成自身配置的时候调用,该方法会回传一个CameraCaptureSession,该session可以开始处理捕获请求,以下动作均在onConfigured中完成

7、调用CaptureRequestBuilder.build()方法,创建CaptureRequest对象,此处使用CaptureRequest类型的变量mCaptureRequest进行接收

8、调用CameraCaptureSession.setRepeatingRequest()方法创建预览,此方法接收三个参数:

·CaptureReqeust:无限重复的请求,此处传入7中创建的captureRequest对象,即mCaptureRequest

·CameraCaptureSession.CaptureCallback:即callback的回调,不过预览中该回调中不用进行任何处理

·Handler:为一个句柄,代表执行callback的handler,如果程序希望直接在当前线程中执行callback,则可以将handler参数设为null

 

3、拍照的流程

3.1 拍照流程图

Camera api2完成预览、拍照录像的流程讲解_第2张图片

3.2 拍照流程详解

 

1、首先,由拍照button的点击,来出发拍照事件,使用ImageReader访问呈现到Surface中的图像,并进行保存,所以在预览的Surface捕获图像的同时,我们也需要ImageReader来同时捕获图像数据,所以在预览的第五步中,CameraDevice.CreateCaptureSession()方法中,我们讲ImageReader的实例也传入第一个参数中,即Arrays.asList(surface,ImageReader.getSurface())

2、调用CameraCaputureSession.capture()方法进行拍照,该方法传入三个参数:

·CaptureRequest:此次拍照的参数设置

·CaptureCallback:callback对象,当这个请求被处理的时候触发,如果为null,此次拍照不会产生任何数据

·Handler:为一个句柄,代表执行callback的handler,如果程序希望直接在当前线程中执行callback,则可以将handler参数设为null

3、创建CameraCaptureSession.CaptureCallback实例,并重写onCaptureProgressed方法,当图图像捕获的流程向前进行的时候,该方法被调用

4、调用CameraDevice.CreateCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)方法,为新的图像捕获请求创建一个CaptureRequest.Builder,并传入CameraDevice.TEMPLATE_STILL_CAPTURE参数

5、调用mCaptureRequestBuilder.addTarget()方法,将访图像信息的ImageReader实例传入,即讲ImageReader的实例,作为一个显示层添加到该请求的目标列表中

6、 设置拍照瞬间的AE、AF状态

7、创建ImagerReader.OnImageAvailableListener方法的实例,并重写OnImageAvailable方法,该方法在ImageReader中的图像信息可用的时候执行

8、处理OnImageAvailable回调中拿到的图像信息,进行存储

Image = ImagerReader.acquireLatestImage()

ByteBuffer = Image.getPlanes()[0].getBuffer()

Byte[]=new bye[ByteBuffer.remaining()]

Buffer.get(bytes)

Write(bytes)

9、执行CameraCaptureSession.CaptureCallback中的OnCaptureCompleted回调,该回调会在图像捕获完成并且所有的结果信息可用的时候执行

10、释放AE、AF

11、恢复预览状态,即重新调用CameraCaptureSession.setRepeatingRequest()即预览的步骤8

 

4、录像

4.1 录像流程图

Camera api2完成预览、拍照录像的流程讲解_第3张图片

4.2 录像流程详解

录像功能通过button点击事件触发

1.创建MedioRecorder实例,以及用于显示预览图像信息的Surface的实例,并

2.调用CaptureRequestBuilder.addTarget()方法,将MedioRecorder和Surface的实例,作为显示层添加到该请求的目标列表中

3.调用CameraDevice.CreateRequest(CameraDevice.TEMPLATE_RECORED)方法,为新的捕获请求创建一个CaptureRequest.Build对象,并用CameraDevice.TEMPLATE_RECORED参数初始化

4.调用CameraDevice.CreateCaptureSession方法,通过提供目标输出集来创建新的捕获会话,该方法传入三个参数

·List:新的用于捕获图像信息的Surface集合,此处为显示预览信息的surface实例,以及记录图像信息用的MediaRecorder的实例

·CameraCaptureSession.StateCallback:用于通知新捕获session的callback

·Handler:为一个句柄,代表执行callback的handler,如果程序希望直接在当前线程中执行callback,则可以将handler参数设为null

5.在步骤4的回调中,重写onConfigured()方法,以下步骤均在onConfigured()方法中完成

6.调用CaptureRequestBuilder.set()方法,设置捕获的参数,此处设置3A算法

7.调用CameraCaptureSession.setRepeatingReqest()方法,通过此捕获session,持续重复捕获图像

8.调用MediaRecorder.start()方法,开始捕获数据并将数据编码到指定文件

9.调用CameraCaptureSession.stopRepeating()方法,取消持续捕获

10、调用CameraCaptureSession.abortCapture()方法,尽可能快地丢弃当前待处理和正在进行的所有捕获

11、调用MediaRecorder.stop,停止图像捕获

12、重新开启预览

你可能感兴趣的:(Camera api2完成预览、拍照录像的流程讲解)