Camera2 api with Preview

时间:2017-04-24 02:19:20

标签: android android-camera android-camera2 android-textureview

我正在使用Camera2 api来显示相机的预览形式。我还想实现一个ImageReader来处理图像。我有一个开始预览功能。当我打电话给它时,预览只是黑色。如果我删除" mimageReader.getSurface()"来自Arrays.asList()我能够看到相机预览。如何显示相机预览并使用ImageReader?

 private void startPreview() 
  {
        List<Surface> outputSurfaces = new ArrayList<>();
        List surfaces = new ArrayList<>();

        SurfaceTexture surfaceTexture =  textureView.getSurfaceTexture();
        surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        Surface previewSurface = new Surface(surfaceTexture);

        try {
            mCaptureRequestBuilder = _cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);




           mCaptureRequestBuilder.addTarget(previewSurface);

            _cameraDevice.createCaptureSession(Arrays.asList(previewSurface,mimageReader.getSurface()),
                    new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(CameraCaptureSession session) {
                            Log.d("", "onConfigured: startPreview");

                            try {
                                session.setRepeatingRequest( mCaptureRequestBuilder.build(),null,mthreadhandler);
                            } catch (CameraAccessException e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onConfigureFailed(CameraCaptureSession session) {
                            Log.d("", "onConfigureFailed: startPreview");

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

2 个答案:

答案 0 :(得分:0)

您必须创建ImageReader的新实例,设置其onImageAvailableListener(您可以在此处理预览帧)并将其添加到PreviewRequestBuilder。例如:

mImageReader = ImageReader.newInstance(
                mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2);

mImageReader.setOnImageAvailableListener(mOnGetPreviewListener, mBackgroundHandler);

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

答案 1 :(得分:0)

可能是因为未调用您的函数startPreview(),当我们一次没有获取surfaceTexture值时,可能会发生这种情况。

这是我的startPreview方法

protected void createCameraPreview() {
    try {
        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;

        texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
        Surface surface = new Surface(texture);

        captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

        captureRequestBuilder.addTarget(surface);
        cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback(){
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                //The camera is already closed
                if (null == cameraDevice) {
                    return;
                }
                // When the session is ready, we start displaying the preview.
                cameraCaptureSessions = cameraCaptureSession;
                updatePreview();
            }
            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                Toast.makeText(MainActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
            }
        }, null);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

然后我调用updatePreview函数以重新启动预览

protected void updatePreview() {
    if(null == cameraDevice) {
        Log.e(TAG, "updatePreview error, return");
    }
    captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
    try {
        cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}