第27讲 Android Camera2 API CameraCaptureSession.CaptureCallback详解

本讲是Android Camera专题系列的第27讲,我们介绍Android Camera2 API专题的CameraCaptureSession.CaptureCallback详解,包括如下内容:

 

  • CameraCaptureSession.CaptureCallback详解
  • CameraCaptureSession.CaptureCallback状态转换

视频在线观看:

CameraCaptureSession.CaptureCallback详解

用于监控Camera HAL处理某个CaptureRequest的处理状态

APIDescription
onCaptureStarted(session, request, long timestamp, long frameNumber)当Camera HAL开始处理这个CaptureRequest时调用,对应这一张图像开始曝光时。或者开始reprocess这个CaptureRequest时调用。
onCaptureProgressed(session, request, CaptureResult partialResult)Camera HAL Pipeline中,部分模块完成这个CaptureRequest的处理,有Partial Result上报时调用。
onCaptureCompleted(session, request, TotalCaptureResult result)这个CaptureRequest处理完成后调用,会打包所有的partial result一起上报给App。
onCaptureBufferLost(session, request, Surface target, long frameNumber)指定Surface不会收到这个CaptureRequest处理后的Buffer了,通常原因是底层处理这路Stream发生错误或因Flush而主动丢帧。
onCaptureFailed(session, request, CaptureFailure failure)整个CaptureRequest处理失败时调用,不会有TotalCaptureResult了,onCaptureCompleted不会被调用。如果CaptureFailure#wasImageCaptured为true则表示某些路Surfaces可能会收到Image Buffer。
onCaptureSequenceAborted(session, int sequenceId)整个序列的CaptureRequest放弃继续处理时调用,通常是由于stopRepeating 或 abortCaptures调用了
onCaptureSequenceCompleted(session, int sequenceId, long frameNumber)整个序列的CaptureRequest处理完后调用,sequence id等于调用送CaptureRequest方法(ex. capture)的返回值

onCaptureStarted

App如何使用

  • 针对拍照的CaptureRequest,比较适合在这个Callback中播放拍照声音,提示用户开始拍照了

参数

  • request:正在处理的CaptureRequest实例
  • timestamp

    • Regular CaptureRequest:这一帧图像开始曝光时的时间戳
    • Reprocess CaptureRequest:输入图像开始曝光时的时间戳

    • 通常用于同步CaptureResult和Image

frameNumber

  • 这一帧的编号,与CaptureResult#getFrameNumber获取到的值一样

onCaptureProgressed

调用次数和时机

  • 处理一个CaptureRequest,可能会有多次onCaptureProgressed回调。最多回调CameraCharacteristics#REQUEST_PARTIAL_RESULT_COUNT次

不同CaptureRequest可以有不同的回调次数

可能发生在onCaptureStarted之前或之后

每次回调的partial result内容都不重复

App如何使用

  • 在性能要求高的场景中,App可以在partial result里面去查询关心的Metadata值,避免在TotalCaptureResult上来时才去查询
    • 比如需要插入到数据库的信息或后处理Image Buffer时需要的信息

CameraCaptureSession.CaptureCallback状态转换

CameraCaptureSession.CaptureCallback状态转换

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用 Android camera2 API 打开/关闭闪光灯,需要先进行如下步骤: 1. 获取 CameraManager 实例 2. 获取可用的相机列表 3. 选择需要使用的相机 4. 创建一个 CameraDevice.StateCallback 实例 5. 打开相机 6. 获取 CameraCharacteristics 实例 7. 获取闪光灯是否可用的信息 8. 创建一个 CaptureRequest.Builder 实例 9. 设置闪光灯状态 10. 构建 CaptureRequest 实例 11. 创建一个 CameraCaptureSession.StateCallback 实例 12. 开始预览 下面是一个简单的示例代码,可以在点击按钮时打开/关闭闪光灯: ``` private CameraManager mCameraManager; private String mCameraId; private CameraDevice mCameraDevice; private CameraCaptureSession mCaptureSession; private CaptureRequest.Builder mPreviewRequestBuilder; private SurfaceTexture mSurfaceTexture; private Surface mPreviewSurface; private boolean mIsFlashOn = false; // 点击按钮时调用 public void toggleFlash() { if (mCameraDevice == null) { return; } // 切换闪光灯状态 mIsFlashOn = !mIsFlashOn; try { // 创建一个新的 CaptureRequest.Builder 实例 mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); // 设置闪光灯状态 mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, mIsFlashOn ? CaptureRequest.FLASH_MODE_TORCH : CaptureRequest.FLASH_MODE_OFF); // 构建 CaptureRequest 实例 CaptureRequest previewRequest = mPreviewRequestBuilder.build(); // 发送请求 mCaptureSession.setRepeatingRequest(previewRequest, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } // 在 onCreate() 方法中调用 private void setupCamera() { mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { // 获取可用的相机列表 String[] cameraIds = mCameraManager.getCameraIdList(); // 选择需要使用的相机 for (String cameraId : cameraIds) { CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_BACK) { mCameraId = cameraId; break; } } // 创建一个 CameraDevice.StateCallback 实例 CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice camera) { mCameraDevice = camera; startPreview(); } @Override public void onDisconnected(CameraDevice camera) { camera.close(); mCameraDevice = null; } @Override public void onError(CameraDevice camera, int error) { camera.close(); mCameraDevice = null; } }; // 打开相机 mCameraManager.openCamera(mCameraId, stateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } // 开始预览 private void startPreview() { try { // 获取 CameraCharacteristics 实例 CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId); // 获取闪光灯是否可用的信息 Boolean flashAvailable = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); // 创建一个 CaptureRequest.Builder 实例 mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); // 设置闪光灯状态 mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); // 获取 SurfaceTexture 实例 mSurfaceTexture = new SurfaceTexture(0); // 获取 Surface 实例 mPreviewSurface = new Surface(mSurfaceTexture); // 添加 Surface 到 CaptureRequest.Builder 实例中 mPreviewRequestBuilder.addTarget(mPreviewSurface); // 创建一个 CameraCaptureSession.StateCallback 实例 CameraCaptureSession.StateCallback callback = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession session) { mCaptureSession = session; try { // 构建 CaptureRequest 实例 CaptureRequest previewRequest = mPreviewRequestBuilder.build(); // 发送请求 mCaptureSession.setRepeatingRequest(previewRequest, null, null); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession session) { session.close(); mCaptureSession = null; } }; // 创建一个 CameraCaptureSession 实例 mCameraDevice.createCaptureSession(Collections.singletonList(mPreviewSurface), callback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 值得注意的是,闪光灯是否可用的信息可以通过 CameraCharacteristics.FLASH_INFO_AVAILABLE 获取。如果该值为 false,则说明该相机不支持闪光灯。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deepinout_camera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值