Camera Api1和Api2对比

Android 5.0对拍照API进行了全新的设计,新增了全新设计的Camera v2 API,这些API不仅大幅提高了Android系统拍照的功能,还能支持RAW照片输出,甚至允许程序调整相机的对焦模式、曝光模式、快门等。

一、 api1主要类(包名android.hardware.Camera):
Camera api1调用流程比较直观,也利于理解一些,应用程序实例化camera这一个类就可以控制摄像头子系统

类名 含义
Camera.java framework中api1的接口类,定义open、startPreview、takePicture、AutoFocus等标准的接口实现。实例方式:mCamera = Camera.open(camId);
Camera.Parameters 参数设置,通过camera内部类Parameters操作实现,如设置帧率,设置图片格式,预览尺寸等具体的设置接口,提供set/get函数;
Camera.CameraInfo 元数据获取,通过camera内部类CameraInfo实现,这里只能获取不能修改;

api2主要类(包名android.hardware.Camera2):
Camera api2在应用层的调用要复杂一些,定义的类也比较多,这也说明对摄像头子系统控制的更加细腻了。

类名 含义
CameraManager 摄像头管理器,这是一个全新的系统管理器,专门用于检测系统摄像头、打开系统摄像头。除此之外,调用CameraManager的getCameraCharacteristics(String)方法即可获取指定摄像头的相关特性。在Camera打开之前主要操作CameraManager,打开后主要操作CameraCaptureSession。实例:getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics 摄像头属性,相当于原CameraInfo。通过CameraManager获取指定id的摄像头属性。 通过获取Camera属性信息,配置Camera输出,如FPS,大小,旋转等。实例获取:mCameraManager.getCameraCharacteristics(currentCameraId);
CameraDevice 代表系统摄像头,该类的功能类似于早期的Camera类。用于创建CameraCaptureSession和关闭摄像头。 通过CameraManager打开Camera,在StateCallback中会得到CameraDevice实例;
CameraCaptureSession Camera打开后主要和CameraCaptureSession打交道,CameraCaptureSession建立了一个和Camera设备的通道,当这个通道建立完成后就可以向Camera发送请求获取图像。当程序需要预览、拍照时,都需要先通过该类的实例创建Session。而且不管预览还是拍照,也都是由该对象的方法进行控制的,其中控制预览的方法为setRepeatingRequest();控制拍照的方法为capture()。为了监听CameraCaptureSession的创建过程,以及监听CameraCaptureSession的拍照过程,Camera v2 API为CameraCaptureSession提供了StateCallback、CaptureCallback等内部类;
CaptureRequest 当程序调用setRepeatingRequest()方法进行预览时,或调用capture()方法进行拍照时,都需要传入CaptureRequest参数。CaptureRequest代表了一次捕获请求,用于描述捕获图片的各种参数设置,比如对焦模式、曝光模式……总之,程序需要对照片所做的各种控制,都通过CaptureRequest参数进行设置;
CaptureRequest.Builder CaptureRequest.Builde中主要结构是一个Map,Builder构建后得到CaptureRequest;

二、Api1和api2 Camera从打开到预览的基础流程比较 (ap端)

api1 api2
1.检查权限android.permission.CAMERA 1.检查权限android.permission.CAMERA
2. Camera.getCameraInfo 2.获取CameraManager
3.获得句柄 Camera.open (cameraId),并打开相机,打开失败的情况下,抛出AndroidRuntime异常 3. mCameraManager.getCameraCharacteristics
4. mCamera.setErrorCallback(mErrorCallback); 4. mCameraManager.openCamera, 传入id和StateCallback
5. Camera.Parameters 5. 获取camera状态,CameraDevice.StateCallback.onOpened (onError/onDisconnected/onClosed),拿CameraDevice实例
6. setPreviewDisplay() 6. 创建Session:CameraDevice.createCaptureSession(surfaces, CameraCaptureSession.StateCallback, mRespondHandler);
7. startPreview() ,Camera.PreviewCallback. onPreviewFrame() 7. CameraCaptureSession.StateCallback. onConfigured (onConfigureFailed/onClosed) 获取session实例
8.BuildCaptureRequest,创建builder,拿到CaptureRequest builder = mCameraDevice.createCaptureRequest(msg.arg1);使用builder去设置camera属性
9.调用setRepeatingRequest开启预览mSession.setRepeatingRequest(builder.build(), mCaptureCallback, null);
10. mCaptureCallback.onCaptureCompleted 反馈捕获结果CameraCaptureSession.CaptureCallback.onCaptureCompleted

三、Api1和api2 Camera 功能设置的比较(ap端)

功能名 api1 api2
闪光灯 parameters.setFlashMode() captureBuilder.set(CaptureRequest.FLASH_MODE, mFlashMode); captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, mAEMode); 与ae关联
曝光 parameters.setExposureCompensation(exposureCompensationIndex); builder.set(CaptureRequest.CONTROL_AE_MODE, mAEMode); builder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, exposureCompensationIndex);
快门声音 在CameraService.cpp中采用播放方式为mediaPlay 全部在ap层使用SoundPool播放,CaptureCallback. onCaptureStarted中播放
预览 Camera. startPreview() mSession.setRepeatingRequest(builder.build(), mCaptureCallback, null);
openCamera Camera.open() mCameraManager.openCamera
拍照 Camera.takePicture(mShutterCallback, mRawCallback, mPostViewCallback, mJpegCallback) 处理数据: mJpegCallback.onPictureTaken(byte[] bytes, Camera camera) mSession.capture(builder.build(), mCaptureCallback, mModeHandler); 处理数据:CaptureReqBuilder.addTarget(ImageReader.getSurface()) ImageReader.OnImageAvailableListener. onImageAvailable(ImageReader imageReader)

你可能感兴趣的:(Android,Camera)