Android Camera2api如何解决?E/BufferQueueProducer:dequeueBuffer:正在尝试超过最大出列缓冲区计数(4)

Android Camera2api如何解决?E/BufferQueueProducer:dequeueBuffer:正在尝试超过最大出列缓冲区计数(4),android,android-camera2,Android,Android Camera2,我正在使用三星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:

我正在使用三星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)
我可以在某些型号的手机中看到这种行为,我试图理解这个错误的含义以及如何解决它, 对于任何线索都会很高兴

我在此附上我的照片,以备不时之需

    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 );
            }
        }
    };

谢谢

我找到了解决缓冲区问题的方法。将ImageReader ImageFormat从JPEG更改为原始格式(YUV_420_888通常也用于视频),然后将图像转换为JPEG格式的RGB解决了三星A10的问题,我还在三星A5、华为、Fairphone和Pocopone上进行了测试。它似乎对所有电话都有效。我读过很多关于实时相机应用程序的书,由于性能优势,似乎建议对单帧使用raw。

我在代码中看不到关闭图像的地方。您需要删除所有图像,以便为下一帧提供缓冲区。我只需在
ByteBuffer buffer=image.getPlanes()[0].getBuffer()之后添加
image.close()
未更改bugHey您是如何将YUV_420_888转换为RGB的?