Camera2 ImageReader зависает через некоторое время с сообщением «Не удалось освободить буфер» - PullRequest
1 голос
/ 14 апреля 2019

У меня проблема с Android2 Camera2 API.Моей конечной целью здесь является создание байтового массива, который я могу редактировать с помощью opencv, одновременно отображая предварительный просмотр для пользователя (например, OCR с предварительным просмотром).Я создал запрос захвата и добавил ImageReader в качестве цели.Затем в OnImageAvailableListener я получаю изображение, преобразовываю его в растровое изображение и затем отображаю его в ImageView (и поворачиваю его).

Моя проблема заключается в том, что через несколько секунд предварительный просмотр останавливается (после постепенного замедления) и в журнале появляется следующая ошибка: E / BufferItemConsumer: [ImageReader-1225x1057f100m2-18869-0]Не удалось освободить буфер: Неизвестная ошибка -1 (1)

Как вы можете видеть в моем коде, я уже пытался закрыть img после получения из него моего байта [].Я также попытался очистить буфер.Я попытался закрыть ImageReader, но это, конечно, помешало мне получить дальнейшие изображения (исключение).

Может кто-нибудь помочь мне понять, что я делаю не так?Я обыскивал Google безрезультатно.

Это мой OnImageAvailableListener, дайте мне знать, если вам нужно больше моего кода, чтобы помочь:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {

            Image img = reader.acquireLatestImage();
            final ImageView iv = findViewById(R.id.camPrev);

            try{

                if (img==null) throw new NullPointerException("null img");
                ByteBuffer buffer = img.getPlanes()[0].getBuffer();
                byte[] data = new byte[buffer.remaining()];
                buffer.get(data);
                final Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        iv.setImageBitmap(b);
                        iv.setRotation(90);
                    }
                });
            } catch (NullPointerException ex){
                showToast("img is null");
            }finally {
                if(img!=null)
                    img.close();
            }
        }
    };

Редактировать - добавить cameraStateCallback

private CameraDevice.StateCallback mCameraDeviceStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice cameraDevice) {
            mCameraDevice = cameraDevice;
            showToast("Connected to camera!");
            createCameraPreviewSession();
        }

        @Override
        public void onDisconnected(CameraDevice cameraDevice) {
            closeCamera();
        }

        @Override
        public void onError(CameraDevice cameraDevice, int i) {
            closeCamera();
        }
    };

    private void closeCamera() {
        if (mCameraDevice != null) {
            mCameraDevice.close();
            mCameraDevice = null;
        }

    }

1 Ответ

0 голосов
/ 15 апреля 2019

Вы, кажется, использовали setRepeatingRequest() для формата Jpeg. Это может не полностью поддерживаться на вашем устройстве, также зависит от выбранного вами разрешения изображения. Обычно мы используем createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) в этих случаях и получаем YUV или необработанный формат из ImageReader.

Я бы попробовал выбрать низкое разрешение для Jpeg: возможно, этого будет достаточно, чтобы запустить ImageReader.

...