Android相机2 api BufferQueue已被放弃

时间:2015-10-30 14:08:28

标签: java android camera2

我正在测试新的Android camera2 API,我希望从相机控制每一帧。我为此做的是创建一个 ImageReader 并设置分辨率和图像格式。

SELECT * FROM [data.example@-3600000--1]

之后,我使用参数 TEMPLATE_PREVIEW 创建新的 CaptureRequest ,并将目标添加到他ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1); imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis()); image.close(); } },null); 。对于 cameraCaptureSession ,我使用此请求创建新的 setRepeatingRequest

imageReader

当我打开相机并开始查看我的预览时,我得到例外。但在异常之前我得到了一些预览图像,之后我有异常

 try {
    final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

    builder.addTarget(imageReader.getSurface());

    mCameraDevice.createCaptureSession(
            Arrays.asList(imageReader.getSurface()),
            new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(CameraCaptureSession session) {
                    mSession = session;
                    try {
                        mSession.setRepeatingRequest(builder.build(),null,null);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
                @Override
                public void onConfigureFailed(CameraCaptureSession session) {

                }
            },
            null
    );
} catch (CameraAccessException e) {
    e.printStackTrace();
}

我该如何解决这个问题?

我使用的是三星Galaxy S5和Android API 21

3 个答案:

答案 0 :(得分:15)

确保您持有对您创建的ImageReader的引用,可能是您定义了mSession的地方。

从ImageReader获取的Surface大致相当于弱指针 - 它不会阻止ImageReader收集垃圾。因此很可能(基于您的命名)ImageReader被破坏,然后发生放弃错误。

答案 1 :(得分:2)

我在我的应用程序中的活动之间切换时遇到了同样的问题,那是在调用onSurfaceTextureDestroyed()后才返回false,但我做的是将其更改为

public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            Log.e(TAG, "onSurfaceTextureDestroyed");
            if(cameraDevice != null){
                closeCamera();

                cameraDevice = null;
            }
            return false;
        }

这对我有用。

答案 2 :(得分:0)

我找到了解决方案,这对我有用,感染错误在于选择正确的大小,因此在使用MediaRecorder.setVideoSize()时,请使用此方法选择最佳大小

private static Size chooseOptimalSize(Size[] choices, int width, int height) {
        Size bigEnough = null;
        int minAreaDiff = Integer.MAX_VALUE;
        for (Size option : choices) {
            int diff = (width*height)-(option.getWidth()*option.getHeight()) ;
            if (diff >=0 && diff < minAreaDiff &&
                    option.getWidth() <= width &&
                    option.getHeight() <= height) {
                minAreaDiff = diff;
                bigEnough = option;
            }
        }
        if (bigEnough != null) {
            return bigEnough;
        } else {
            Arrays.sort(choices,new CompareSizeByArea());
            return choices[0];
        }

    }