Camera2 api с предварительным просмотром

Я использую 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();
        }
    }

person amanda45    schedule 24.04.2017    source источник


Ответы (2)


Вам необходимо создать новый экземпляр ImageReader, установить для него onImageAvailableListener (здесь вы можете обработать кадры предварительного просмотра) и добавить его в PreviewRequestBuilder. Например:

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

mImageReader.setOnImageAvailableListener(mOnGetPreviewListener, mBackgroundHandler);

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
person Songpol Rungsawang    schedule 05.07.2017

Это может быть потому, что ваша функция 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();
    }
}
person Aravind jayan    schedule 25.07.2019