Camera2api Как решить? E / BufferQueueProducer: dequeueBuffer: попытка превысить максимальное число буферов в очереди (4) - PullRequest
0 голосов
/ 03 марта 2020

Я использую Samsung-A10
с SDK 28

Я пытаюсь снимать изображения с помощью camera2api, но всегда после сбора 14 кадров я получаю

I/com.oculid.daq: NativeAlloc concurrent copying GC freed 3481(447KB) AllocSpace objects, 33(1580KB) LOS objects, 49% free, 3MB/7MB, paused 149us total 174.997ms
D/NetworkManagementSocketTagger: tagSocket(92) with statsTag=0xffffffff, statsUid=-1
D/NetworkManagementSocketTagger: tagSocket(100) with statsTag=0xffffffff, statsUid=-1
D/NetworkManagementSocketTagger: tagSocket(96) with statsTag=0xffffffff, statsUid=-1
D/NetworkManagementSocketTagger: tagSocket(101) with statsTag=0xffffffff, statsUid=-1
D/NetworkManagementSocketTagger: tagSocket(106) with statsTag=0xffffffff, statsUid=-1
D/IR_CAMERA: camera stateCallback onError
E/BufferQueueProducer: [ImageReader-1280x720f100m1-965-0] dequeueBuffer: attempting to exceed the max dequeued buffer count (4)

Я вижу такое поведение в некоторых моделях телефонов, я пытаюсь понять, что означает эта ошибка и как ее решить, буду рад любым потенциальным клиентам.

Я прилагаю сюда свой OnimageAvailable в случае, если его помощь

    private ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
        @RequiresApi(api = Build.VERSION_CODES.P)
        @Override
        /*
         * gets a  the "reader" the callback is associated with.
         * transfer to bytes
         */

        public void onImageAvailable(ImageReader reader) {
            //Log.i(TAG,"readerListener on onImageAvailable");
            long imageReaderTime = SystemClock.elapsedRealtimeNanos();
            frameIndexForFileName++;
            //Log.i(TAG, String.format("Frame index: %08d", frameIndexForFileName));
            try (Image image = reader.acquireNextImage()) {

                //convert the image to bytes
                ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[buffer.capacity()];
                buffer.get(bytes);

                double frameCaptureDuration = (double) (SystemClock.elapsedRealtimeNanos() - imageReaderTime) / 1000000;
                Log.i(TAG, String.format("TIME_MEASUREMENT: Capture of frame %08d took %f ms", frameIndexForFileName, frameCaptureDuration));

                Bitmap bmp = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 60, stream);
                byte[] compressImage = stream.toByteArray();
                bmp.recycle();
                //image.close();
                //reader.discardFreeBuffers();
                imageListener.onImage(compressImage, imageReaderTime);



            } catch (Exception e) {
                e.printStackTrace();
                Log.e(TAG, "!!!!!!!!!!!!!!!!onImageAvailable: " + e );
            }
        }
    };

спасибо

1 Ответ

1 голос
/ 07 марта 2020

Я нашел решение проблемы с буфером. Изменение ImageReader ImageFormat с JPEG на необработанный формат (YUV_420_888 обычно также используется для видео) и преобразование изображений позже в RGB для jpegs решило проблему для Samsung A10, я также протестировал его на Samsung A5 и Huawei, Fairphone и Pocophone. Вроде работает на всех телефонах. Я много читал о приложениях камер в реальном времени, и кажется, что использование сырых кадров для отдельных кадров рекомендуется из-за преимуществ в производительности.

...