как правильно закрыть камеру с помощью camera2API

Я запускаю игру Andorid, которая в фоновом режиме (при представлении графического интерфейса) делает фотографии с помощью камеры ( Camera2). Моя проблема в том, что после того, как я отдаю команду на закрытие, я продолжаю собирать еще 5 снимков. и только потом камеру закрыть. Я делаю один снимок в секунду, поэтому 5 снимков означают на 5 секунд больше....

Я настраиваю свою камеру следующим образом:

mImageReader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1); 
outputSurfaces.clear();
outputSurfaces.add(mImageReader.getSurface());
mCaptureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
mCaptureBuilder.addTarget(mImageReader.getSurface());
mCaptureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
int mDisplayRotation = mActivity.getWindowManager().getDefaultDisplay().getRotation();
int capture_rotation = ORIENTATIONS.get(mDisplayRotation);

mCaptureBuilder.set(CaptureRequest.JPEG_ORIENTATION, capture_rotation);
mCaptureBuilder.set(CaptureRequest.JPEG_QUALITY, (byte)100);

mCaptureBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CaptureRequest.CONTROL_AE_ANTIBANDING_MODE_50HZ);
Range<Integer> aeTargetFpsRange = new Range<>(1,1);
mCaptureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, aeTargetFpsRange);
mCaptureBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_OFF);
mCaptureBuilder.set(CaptureRequest.EDGE_MODE, CaptureRequest.EDGE_MODE_OFF);
mCaptureBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CaptureRequest.NOISE_REDUCTION_MODE_MINIMAL);
mImageReader.setOnImageAvailableListener(readerListener, mImageHandler);

моя функция остановки следующая:

    void stopFrameCapture() {
        Log.d(TAG, "stopFrameCapture: ");;
        try {
            mCaptureSession.stopRepeating();
            Log.d(TAG, "stopFrameCapture: stop repeating");
        } catch (CameraAccessException e) {
            Log.e(TAG, "stopFrameCapture: error" );
            e.printStackTrace();
        }
        if (mCaptureSession != null) {
            Log.d(TAG, "stopFrameCapture: close Caprturesession");
            mCaptureSession.close();
            mCaptureSession = null;
        }

        if (mCameraDevice != null) {
            Log.d(TAG, "stopFrameCapture: close CameraDevice");
            mCameraDevice.close();
            mCameraDevice = null;
        }

        if (mImageReader != null) {
            Log.d(TAG, "stopFrameCapture: close mImageReader");
            mImageReader.close();
            mImageReader = null;
        }

        stopBackgroundThreads();
        Log.i(TAG, "closed all threads.");
    }

После долгой отладки я заметил, что когда функция stopFrameCapture() пытается mImageReader.close();вместо этого вынимаете еще 5 снимков и закрываете только камеру. Я тоже подумал, может быть, есть очередь фото, но на телефоне я вижу, как прошивает оборудование.

В моем слушателе onImageAvailable у меня есть следующее:

image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes);

у кого-нибудь есть идея, что я делаю не так?

спасибо за помощь.

0 ответов

Другие вопросы по тегам