作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用新的 Android camera2 API 进行测试,我想通过相机控制每一帧。我为此做的是创建一个 ImageReader 并设置分辨率和图像格式。
ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis());
image.close();
}
},null);
之后,我使用参数 TEMPLATE_PREVIEW 创建新的 CaptureRequest 并将目标添加到他的 imageReader
中。对于 cameraCaptureSession,我使用此请求创建新的 setRepeatingRequest
try {
final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(imageReader.getSurface());
mCameraDevice.createCaptureSession(
Arrays.asList(imageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
mSession = session;
try {
mSession.setRepeatingRequest(builder.build(),null,null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
}
},
null
);
} catch (CameraAccessException e) {
e.printStackTrace();
}
当我打开相机并开始查看我所拥有的预览时,出现异常。但在异常之前我得到了一些预览图像,之后我有异常
10-30 16:00:32.850 1390-1894/.camera2tutorial E/BufferQueueProducer﹕ [unnamed-1390-1] dequeueBuffer: BufferQueue has been abandoned
10-30 16:00:32.850 1390-1894/.camera2tutorial E/Legacy-CameraDevice-JNI﹕ LegacyCameraDevice_nativeProduceFrame: Error while producing frame No such device (-19).
10-30 16:00:32.850 1390-1894/.camera2tutorial W/SurfaceTextureRenderer﹕ Surface abandoned, dropping frame.
android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:64)
at android.hardware.camera2.legacy.LegacyCameraDevice.produceFrame(LegacyCameraDevice.java:516)
at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:699)
at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:145)
at android.os.HandlerThread.run(HandlerThread.java:61)
我该如何解决这个问题??
我使用的是三星 Galaxy S5 和 Android API 21
最佳答案
确保您持有对您创建的 ImageReader 的引用,可能是在您定义了 mSession 的任何地方。
您从 ImageReader 获得的 Surface 大致相当于一个弱指针 - 它不会阻止 ImageReader 进行垃圾回收。所以很可能(根据您的命名)ImageReader 被破坏,然后发生放弃错误。
关于java - Android camera 2 api BufferQueue 已被废弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33437961/
我使用cocos2d-x和Lua进行开发。最近我使用 Instruments 并发现了一些被废弃的内存:cocos2d-x 在自己的自动释放池中对对象执行释放,但我仍然有来自 Lua 的引用。如何确定
我是一名优秀的程序员,十分优秀!