0

我有一个 Android 应用程序,它可以在没有预览表面的情况下拍照。我已经使用 Lollipop 的新 camera2 - api 21 实现了这一点

代码是这样的:

                final CaptureRequest.Builder jpegRequest = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
                // Render to our image reader:
                jpegRequest.addTarget(imageReaderSurface);
                // Configure auto-focus (AF) and auto-exposure (AE) modes:
                jpegRequest.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                jpegRequest.set(CaptureRequest.CONTROL_AE_MODE, autoExposureModeFinal);
                jpegRequest.set(CaptureRequest.JPEG_ORIENTATION, correctOrientation(context, characteristics));

                if (previews == 0) {
                    saveImage(camera, session, jpegRequest.build());
                } else {
                    // Take previews to dummySurface to allow camera to warm up before saving jpeg:
                    final CaptureRequest.Builder captureBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
                    // Render to our dummy preview surface:
                    captureBuilder.addTarget(outputSurfaces.get(1));
                    // Configure auto-focus (AF) and auto-exposure (AE) modes:
                    captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                    captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, autoExposureModeFinal);

                    session.setRepeatingRequest(captureBuilder.build(), new CameraCaptureSession.CaptureCallback() {
                        int mNumCaptures;

                        @Override
                        public void onCaptureCompleted(CameraCaptureSession completedSession, CaptureRequest request, TotalCaptureResult result) {
                            //Log.d("mNumCaptures", String.valueOf(mNumCaptures));
                            if (++mNumCaptures == previews) {
                                try {
                                    completedSession.stopRepeating();
                                    saveImage(camera, session, jpegRequest.build());
                                    //session.abortCaptures();
                                    closeCamera(camera, looper);
                                } catch (CameraAccessException e) {
                                    error("Error saving image", e);
                                    closeCamera(camera, looper);
                                }
                            }
                        }
                    }, null);

                }

我已经在带有 Android 6 的 nexus 5x 上对此进行了测试,并且可以正常工作。previews 设置为 20 - 您需要捕获更多图像才能使相机适应光线。

我已经用 Galaxy s5 - Android 5 测试了这段代码,但它不起作用。我收到此错误:超出最小未排队缓冲区计数

03-16 15:01:09.569: W/ArrayUtils(30646): Ignoring invalid value emboss
03-16 15:01:09.569: W/ArrayUtils(30646): Ignoring invalid value sketch
03-16 15:01:09.569: W/ArrayUtils(30646): Ignoring invalid value neon
03-16 15:01:09.599: I/CameraManager(30646): Using legacy camera HAL.
03-16 15:01:10.059: W/ArrayUtils(30646): Ignoring invalid value emboss
03-16 15:01:10.059: W/ArrayUtils(30646): Ignoring invalid value sketch
03-16 15:01:10.059: W/ArrayUtils(30646): Ignoring invalid value neon
03-16 15:01:10.089: W/ArrayUtils(30646): Ignoring invalid value emboss
03-16 15:01:10.089: W/ArrayUtils(30646): Ignoring invalid value sketch
03-16 15:01:10.089: W/ArrayUtils(30646): Ignoring invalid value neon
03-16 15:01:10.109: I/CameraDeviceState(30646): Legacy camera service transitioning to state CONFIGURING
03-16 15:01:10.109: I/RequestThread-0(30646): Configure outputs: 2 surfaces configured.
03-16 15:01:10.109: D/Camera(30646): app passed NULL surface
03-16 15:01:10.119: I/RequestThread-0(30646): configureOutputs - set take picture size to 800x480
03-16 15:01:10.209: I/CameraDeviceState(30646): Legacy camera service transitioning to state IDLE
03-16 15:01:10.219: D/info(30646): Not using a front facing camera.
03-16 15:01:10.229: D/info(30646): Sensor orientation: 90 degrees
03-16 15:01:10.229: D/info(30646): Device orientation: 0 degrees
03-16 15:01:10.229: D/info(30646): Returning JPEG orientation of 90 degrees
03-16 15:01:10.229: I/RequestQueue(30646): Repeating capture request set.
03-16 15:01:10.239: W/LegacyRequestMapper(30646): convertRequestMetadata - control.awbRegions setting is not supported, ignoring value
03-16 15:01:10.239: W/LegacyRequestMapper(30646): Only received metering rectangles with weight 0.
03-16 15:01:10.239: W/LegacyRequestMapper(30646): Only received metering rectangles with weight 0.
03-16 15:01:11.019: I/CameraDeviceState(30646): Legacy camera service transitioning to state CAPTURING
03-16 15:01:11.209: E/BufferQueueProducer(30646): [unnamed-30646-2] dequeueBuffer: min undequeued buffer count (2) exceeded (dequeued=5 undequeued=1)
03-16 15:01:14.039: I/RequestQueue(30646): Repeating capture request cancelled.
03-16 15:01:14.439: E/BufferQueueProducer(30646): [unnamed-30646-2] cancelBuffer: BufferQueue has been abandoned
03-16 15:01:14.439: E/BufferQueueProducer(30646): [unnamed-30646-2] cancelBuffer: BufferQueue has been abandoned
03-16 15:01:14.439: E/BufferQueueProducer(30646): [unnamed-30646-2] cancelBuffer: BufferQueue has been abandoned
03-16 15:01:14.439: E/BufferQueueProducer(30646): [unnamed-30646-2] cancelBuffer: BufferQueue has been abandoned

即使我将预览设置为 0,我也会收到相同的错误。

我发现了一些有关“超出最小未排队缓冲区计数”错误的主题,但所有这些主题都与不推荐使用的相机类有关。你知道我是否可以在 Android 5 上解决这个问题吗?

谢谢

4

1 回答 1

0

作为尝试,看看增加 JPEG ImageReader 的 maxImages 参数是否会有所帮助。

于 2016-03-17T18:59:49.753 回答