Android Camera2提升及调用详解

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Camera2详解

官方的说法:Camera2 API

∙Supports 30fps full resolution with burst mode

支持30fps的全高清连拍

∙Supports change on manual camera settings between frame capture 支持帧之间的手动设置

∙Supports RAW image capture

支持RAW格式的图片拍摄

∙Supports Zero Shutter Lag & Movie Snapshot

支持快门0延迟以及电影速拍

∙Supports setting other manual camera device controls including level of Noise Cancelling

支持相机其他方面的手动控制包括噪音消除的级别

∙TextureView代替SurfaceView展示预览

还有部分新功能没有列出

Google采用了pipeline(管道)的概念,将Camera Device相机设备和Android Device安卓设备连接起来,android Device通过管道发送CaptureRequest拍照请求给Camera Device,Camera Device通过管道返回CameraMetadata数据给Android Device,这一切建立在一个叫作CameraCaptureSession的会话中。

下面是camera2包中的主要类:

其中CameraManager是所有相机设备(CameraDevice)的管理者,而每个CameraDevice自己会负责建立CameraCaptureSession以及建立CaptureRequest。CameraCharacteristics是CameraDevice的属性描述类,在CameraCharacteristics 中可以进行相机设备功能的详细设定(当然了,首先你得确定你的相机设备支持这些功能才行)。

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

这些类是如何相互配合的?下面是简单的流程图:

1.可以看出调用openCamera方法后会回调CameraDevice.StateCallback这个

方法,在该方法里重写onOpened函数。

2.在onOpened方法中调用createCaptureSession,该方法又回调

CameraCaptureSession.StateCallback方法。

3.在CameraCaptureSession.StateCallback中重写onConfigured方法,设置

setRepeatingRequest方法(也就是开启预览了)。

4.setRepeatingRequest又会回调

CameraCaptureSession.CaptureCallback方法。

5.重写CameraCaptureSession.CaptureCallback中的

onCaptureCompleted方法,result就是未经过处理的元数据了。

顺便提一下onCaptureProgressed方法很明显是在Capture过程中的,也就是在onCaptureCompleted之前,所以,在这之前相对图像干什么就看你的了,像美颜等操作就可以在这个方法中实现了。

可以看出Camera2相机使用的逻辑还是比较简单的,其实就是3个Callback函数的回调,先说一下:setRepeatingRequest和capture方法其实都是向相机设备发送获取图像的请求,但是capture就获取那么一次,而setRepeatingRequest就是不停的获取图像数据,所以呢,使用capture就想拍照一样,图像就停在那里了,但是setRepeatingRequest一直在发送和获取,所以需要连拍的时候就调用它,然后在onCaptureCompleted中保存图像就行了。(注意了,图像的预览也是用的setRepeatingRequest,只是你不处理数据就行了)

调用流程:

1.获取TextureView对象

mPreviewView=(TextureView)findViewById(R.id.textureview); mPreviewView.setSurfaceTextureListener(this);//

2.TextureView初始化完毕开始初始化相机并绑定CameraID

@SuppressWarnings("ResourceType")

@Override

public void onSurfaceTextureAvailable(SurfaceT exture surface, int width, int height) { CameraManager cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);

try {

String[] CameraIdList = cameraManager.getCameraIdList();

//获取可用相机设备列表

CameraCharacteristics characteristics =

cameraManager.getCameraCharacteristics(CameraIdList[0]);

//在这里可以通过CameraCharacteristics设置相机的功能,当然必须检查是否支持

characteristics.get(_SUPPORTED_HARDWARE_LEVEL);

//就像这样

cameraManager.openCamera(CameraIdList[0], mCameraDeviceStateCallback, mHandler);//添加相机驱动的回调对象

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

@Override

public void onSurfaceTextureSizeChanged(SurfaceT exture surface, int width, int height) {}

@Override

public boolean onSurfaceT extureDestroyed(SurfaceTexture surface) {

return false;

}

@Override

public void onSurfaceTextureUpdated(SurfaceT exture surface) {}

3.获取相机驱动的回调//在相机打开时开启相机预览

privateCameraDevice.StateCallback mCameraDeviceStateCallback = new

相关文档
最新文档