Camera App分析
架构类图
CameraManager–>CameraDevice–>CaptureRequest–>CaputureSession
1,opencamera过程:
1.1设置camera 预览输出大小。
1.1.1 manager.getCameraIdList()首先获取cameraid。
1.1.2 manager.getCameraCharacteristics(cameraId)根据cameraid获取camera支持的特性
1.1.3 map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
获取到支持的图像大小列表。
1.1.4 mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
ImageFormat.JPEG, /maxImages/2);
根据图像最大size创建capture流。
1.1.5 根据最大size的宽高比aspectRatio,和display大小来计算option.getHeight() == option.getWidth() * h / w 得到预览size。
1.2 开始打开camera ,manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
2,preview过程:
2.1 在open的时候会回调CameraDevice.StateCallback mStateCallback —-onOpened(@NonNull CameraDevice cameraDevice) 来获取 到cameradevice对象。
2.2 SurfaceTexture texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());根据preview size创建surfacetext。
2.3 mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);在根据surface创建capturerequest builder
2.4 mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 由预览surface和拍照surface流创建 capturesession,并显示预览画面。
2.5 onConfigured(@NonNull CameraCaptureSession cameraCaptureSession)回调获取到capturesession
2.6 mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(mPreviewRequestBuilder);设置af和flash的模式。
2.7 mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);最后显示预览图像。
3,capture过程:
3.1 点击拍照键会调用takePicture
3.2 mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
CameraMetadata.CONTROL_AF_TRIGGER_START);开始对焦
3.3 开始拍照mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler);
3.4 通过mCaptureCallback回调onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request,
@NonNull CaptureResult partialResult)
3.5 captureStillPicture函数调用CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());创建capturebuilder
3.6 captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation));设置拍照旋转方向,有display的方向选择
3.7 在回调onCaptureCompleted(@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result)
3.8 ,ImageReader.OnImageAvailableListener回调将图片数据写到file中。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182031.html