目录
1、Camera api2中的主要的类
2、预览的流程
2.1 预览流程图
2.2 预览流程详解
3、拍照的流程
3.1 拍照流程图
3.2 拍照流程详解
4、录像
4.1 录像流程图
4.2 录像流程详解
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
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
·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
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
录像功能通过button点击事件触发
1.创建MedioRecorder实例,以及用于显示预览图像信息的Surface的实例,并
2.调用CaptureRequestBuilder.addTarget()方法,将MedioRecorder和Surface的实例,作为显示层添加到该请求的目标列表中
3.调用CameraDevice.CreateRequest(CameraDevice.TEMPLATE_RECORED)方法,为新的捕获请求创建一个CaptureRequest.Build对象,并用CameraDevice.TEMPLATE_RECORED参数初始化
4.调用CameraDevice.CreateCaptureSession方法,通过提供目标输出集来创建新的捕获会话,该方法传入三个参数
·List
·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、重新开启预览