Camera2 ImageReader 冻结重复捕获请求

13

我正在尝试使用camera2 API从相机中捕获图像数据。 我大多数情况下使用了来自android Capture2RAW示例的代码。 在完全停止之前,只有少量图像可以传送(即调用onImageAvailable)。 我已经尝试使用RAW_SENSOR和JPEG格式以不同大小进行捕获,但结果相同。 我做错了什么?

this.mImageReader = ImageReader.newInstance(width, height, ImageFormat.RAW_SENSOR, /*maxImages*/ 1);
Surface surface = this.mImageReader.getSurface();
final List<Surface> surfaces = Arrays.asList(surface);
this.mCamera.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {
    // Callback methods here
}, null);
CaptureRequest.Builder captureRequestBuilder;
captureRequestBuilder = this.mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder.addTarget(surface);
this.mCaptureRequest = captureRequestBuilder.build();
this.mCaptureSession.setRepeatingRequest(mCaptureRequest, null, null);
1个回答

23

修复了。由ImageReader生成的图像需要关闭,否则它们会迅速填满内存。

@Override
onImageAvailable(ImageReader reader) {
    Image image = reader.acquireLatestImage();
    // Process the image
    image.close();
}

2
非常感谢您的解释!我的应用程序在获取7帧后会冻结。 - Volodymyr Kulyk
2
非常感谢。这个API处理内存的方式很奇怪。 - jokeman
4
非常感谢。我需要关闭你的图像,而不是你的阅读器。 - Maksim Dmitriev
非常感谢。我花了一整天的时间来调试我的代码,以为我的实现有问题。 - Muhammad Babar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接