如何解决捕获图像时获取 BufferUnderflowException
我的应用程序在打开相机时崩溃。但仅限于某些特殊设备,如 Asus Z00ED Zenfone Laser Android 5.0 和 Sony Xperia Xa F3116 Android 7.0。它抛出了 BufferUnderflowException 但我不知道为什么以及如何修复它。
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
if (reader == null) {
return;
}
Image captureImage = reader.acquireLatestImage();
if (captureImage == null) {
return;
}
final byte[] yuvBytes = new byte[(captureImage.getWidth() * captureImage.getHeight()) + (captureImage.getWidth() * captureImage.getHeight()) / 2];
Log.i("Hung98","onImageAvailable: " + (captureImage.getWidth() * captureImage.getHeight()) + (captureImage.getWidth() * captureImage.getHeight()) / 2);
Log.i("Hung98","width: " + captureImage.getWidth());
Log.i("Hung98","Height: " + captureImage.getHeight());
int offset = 0;
for (Image.Plane plane : captureImage.getPlanes()) {
ByteBuffer buffer = plane.getBuffer();
int rowStride = plane.getRowStride();
int pixelStride = plane.getPixelStride();
int width = captureImage.getWidth() / pixelStride;
int height = captureImage.getHeight() / pixelStride;
for (int row = 0; row < height; row++) {
buffer.position(row * (rowStride / pixelStride));
buffer.get(yuvBytes,offset,width);
offset += width;
}
}
onPreviewFrame(yuvBytes);
captureImage.close();
}
};
这是日志:
03-31 16:42:02.817 19619-19619/com.densowave.dwqrkitsample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.densowave.dwqrkitsample,PID: 19619
java.nio.BufferUnderflowException
at java.nio.Buffer.checkGetBounds(Buffer.java:171)
at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:113)
at com.densowave.dwqrkit.DWQRCameraSurfaceView$2.onImageAvailable(DWQRCameraSurfaceView.java:626)
at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:547)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
我记录了一些值,并在第 239 行看到缓冲区剩余小于宽度(缓冲区长度)=> 抛出的 BufferUnderflowException。剩余的缓冲区 = 缓冲区限制减去位置,所以我认为在这种情况下位置计算公式是不正确的,但几乎在另一个设备上是正确的。
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: pos: 87952
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: limit : 88320
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: offset: 517680
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: width: 720
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: buffer remaining: 368
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample I/YUV: row: 239
04-02 10:50:43.309 14888-14888/com.densowave.dwqrkitsample D/AndroidRuntime: Shutting down VM
04-02 10:50:43.310 14888-14888/com.densowave.dwqrkitsample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.densowave.dwqrkitsample,PID: 14888
java.nio.BufferUnderflowException
at java.nio.Buffer.checkGetBounds(Buffer.java:171)
at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:113)
at com.densowave.dwqrkit.DWQRCameraSurfaceView$2.onImageAvailable(DWQRCameraSurfaceView.java:643)
at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:547)
我该如何解决?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。