CameraCaptureSession的setRepeatingRequest应传入哪种Capture Callback?
关于CameraCaptureSession.setRepeatingRequest的CaptureCallback选择
嘿,先纠正一个小细节:你提到的PictureCaptureCallback应该是继承自CameraCaptureSession.CaptureCallback才对,它是相机会话的内部回调类,不是直接继承CameraCaptureSession哦。
接下来咱们分场景说该选哪种回调:
1. 如果你要做实时预览帧处理(比如实时滤镜、人脸检测)
这时候你需要自定义一个专门的CameraCaptureSession.CaptureCallback,或者配合ImageReader.OnImageAvailableListener来处理帧数据。这个回调里你主要重写onCaptureCompleted()或者onCaptureProgressed(),用来监听每一次预览帧的捕获状态,或者获取帧的元数据(比如曝光、对焦参数)。
为什么不推荐用PictureCaptureCallback?因为这类回调是为单次拍照设计的——它的逻辑通常是在拍照完成后处理图片数据(比如保存到本地),而setRepeatingRequest是持续触发的循环捕获,用它的话会频繁触发拍照完成的逻辑,既浪费资源,也不符合预览的需求。
2. 如果你只是需要启动预览,不需要额外处理帧数据
那你完全可以传一个空的CaptureCallback,比如:
new CameraCaptureSession.CaptureCallback() {}
或者用系统默认的实现,只要能让预览正常循环起来就行。
总结一下选择逻辑
- 处理预览帧:自定义
CameraCaptureSession.CaptureCallback,聚焦预览相关的状态监听和数据处理 - 仅启动预览:空回调或默认实现就够了
- 拍照操作:才用
PictureCaptureCallback(配合capture()方法,而不是setRepeatingRequest)
举个自定义预览回调的简单例子:
private CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); // 在这里可以处理预览帧的捕获完成状态,比如获取当前的曝光、对焦信息 // 如果需要获取实际的帧图像数据,还要配合ImageReader的监听来实现 } };
内容的提问来源于stack exchange,提问作者Alberto PR
相关产品推荐
相关产品推荐

