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