提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
前面已经分析了Camera2的open流程,接下来我们分析一下Camera2的预览流程。
一、流程图
二、相机预览流程
- 从 TextureView 获取到 SurfaceTexture
- 将 SurfaceTexture 默认缓冲区的大小配置为相机预览的大小
- 新建一个 Surface 作为预览输出
- CaptureRequest.Builder 设置 Surface
- 创建 CameraCaptureSession 用于相机预览
- 创建成功 CameraCaptureSession 后给 CaptureRequest.Builder 设置自动对焦,必要时开启闪光灯
- 开始显示相机预览,CameraCaptureSession 发送预览请求
1. 创建预览会话
代码如下(示例):
// 创建预览会话
private void createCameraCaptureSession() {
try {
// Here, we create a CameraCaptureSession for camera preview.
// 此处的mCameraDevice即CameraDevice.StateCallback回调返回的CameraDeviceImpl实例
mCameraDevice.createCaptureSession(Arrays.asList(mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
Log.d(TAG, "createCameraCaptureSession onConfigured");
// The camera is already closed
if (null == mCameraDevice) {
Log.d(TAG, "createCameraCaptureSession null == mCameraDevice");
return;
}
Log.d(TAG, "createCameraCaptureSession mCaptureSession = cameraCaptureSession;");
// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
synchronized (mOpenCameraObj) {
mOpenCameraObj.notifyAll();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
Log.d(TAG, "Configuration Failed");
synchronized (mOpenCameraObj) {
isCameraOpen = false;
mOpenCameraObj.notifyAll();
}
}
}, null);
} catch (Exception e) {
e.printStackTrace();
exitWhenException();
}
}
2. 发送拍照请求
代码如下(示例):
public void startCaptureStillPicture() {
Log.d(TAG, "startCaptureStillPicture");
try {
if (null == mCameraDevice) {
Log.d(TAG, "takePicture null == mCameraDevice");
return;
}
/* 创建捕获请求,传入参数可以为:
CameraDevice.TEMPLATE_PREVIEW: Create a request suitable for a camera preview window
CameraDevice.TEMPLATE_STILL_CAPTURE: Create a request suitable for still image capture
CameraDevice.TEMPLATE_RECORD: Create a request suitable for video recording
CameraDevice.TEMPLATE_VIDEO_SNAPSHOT: Create a request suitable for still image capture while recording video
CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG: Create a request suitable for zero shutter lag still capture
CameraDevice.TEMPLATE_MANUAL: A basic template for direct application control of capture parameters
*/
final CaptureRequest.Builder captureBuilder = mCameraDevice
.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
CameraCaptureSession.CaptureCallback CaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
Log.d(TAG, "onCaptureCompleted");
}
@Override
public void onCaptureBufferLost(CameraCaptureSession session,
CaptureRequest request, Surface target, long frameNumber) {
Log.d(TAG, "onCaptureBufferLost");
}
@Override
public void onCaptureStarted(CameraCaptureSession session,
CaptureRequest request, long timestamp, long frameNumber) {
Log.d(TAG, "onCaptureStarted");
}
public void onCapturePartial(CameraCaptureSession session,
CaptureRequest request, CaptureResult result) {
Log.d(TAG, "onCapturePartial");
}
@Override
public void onCaptureProgressed(CameraCaptureSession session,
CaptureRequest request, CaptureResult partialResult) {
Log.d(TAG, "onCaptureProgressed");
}
@Override
public void onCaptureFailed(CameraCaptureSession session,
CaptureRequest request, CaptureFailure failure) {
Log.d(TAG, "onCaptureFailed");
}
@Override
public void onCaptureSequenceCompleted(CameraCaptureSession session,
int sequenceId, long frameNumber) {
Log.d(TAG, "onCaptureSequenceCompleted");
}
@Override
public void onCaptureSequenceAborted(CameraCaptureSession session,
int sequenceId) {
Log.d(TAG, "onCaptureSequenceAborted");
}
};
mCaptureSession.stopRepeating();
Handler handler = getBackgroundHandler();
// 发送捕获请求
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, handler);
} catch (Exception e) {
e.printStackTrace();
exitWhenException();
}
}
总结
未完待续。