java Android camera 2 api BufferQueue 已弃用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33437961/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android camera 2 api BufferQueue has been abandoned
提问by mr.leo
I am testing with new Android camera2API and I want control each frame from camera. What I do for this is create an ImageReaderand set up resolution and image format.
我正在使用新的 Android camera2API进行测试,我想从相机控制每一帧。我为此所做的是创建一个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);
After that I create new CaptureRequestwith parameter TEMPLATE_PREVIEWand add target to him imageReader
. For cameraCaptureSessionI create new setRepeatingRequestwith this request
之后,我使用参数TEMPLATE_PREVIEW创建新的CaptureRequest并将目标添加到他。对于cameraCaptureSession我用这个请求创建了新的setRepeatingRequestimageReader
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();
}
When I opened camera and start view what I have with preview I get exception. But before exception it I got some preview image and after that I have exception
当我打开相机并开始查看我拥有的预览时,我得到了异常。但在例外之前我得到了一些预览图像,之后我有例外
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.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)
How can I fix this??
我怎样才能解决这个问题??
I am using a Samsung Galaxy S5 and Android API 21
我使用的是三星 Galaxy S5 和 Android API 21
回答by Eddy Talvala
Make sure you're holding a reference to the ImageReader you create, probably wherever you have mSession defined.
确保您持有对您创建的 ImageReader 的引用,可能在您定义了 mSession 的任何地方。
The Surface you get from the ImageReader is roughly equivalent to a weak pointer - it won't prevent the ImageReader from getting garbage collected. So most likely (based on your naming) the ImageReader is getting destroyed and the abandonment error then occurs.
您从 ImageReader 获得的 Surface 大致相当于一个弱指针 - 它不会阻止 ImageReader 收集垃圾。所以很可能(根据您的命名) ImageReader 被破坏,然后发生放弃错误。
回答by Ahmed Salim
I had the same problem when switching between activities in my app and that was after calling onSurfaceTextureDestroyed()
which was only returning false, But what i did is i changed it to
我在我的应用程序中的活动之间切换时遇到了同样的问题,那是在调用onSurfaceTextureDestroyed()
后只返回 false,但我所做的是将其更改为
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
Log.e(TAG, "onSurfaceTextureDestroyed");
if(cameraDevice != null){
closeCamera();
cameraDevice = null;
}
return false;
}
and that worked for me.
这对我有用。
回答by rakesh kejriwal
i found solution, this worked for me, infect error is in choosing correct size , so while using MediaRecorder.setVideoSize() use this method to choose optimal size
我找到了解决方案,这对我有用,感染错误在于选择正确的大小,因此在使用 MediaRecorder.setVideoSize() 时使用此方法选择最佳大小
private static Size chooseOptimalSize(Size[] choices, int width, int height) {
Size bigEnough = null;
int minAreaDiff = Integer.MAX_VALUE;
for (Size option : choices) {
int diff = (width*height)-(option.getWidth()*option.getHeight()) ;
if (diff >=0 && diff < minAreaDiff &&
option.getWidth() <= width &&
option.getHeight() <= height) {
minAreaDiff = diff;
bigEnough = option;
}
}
if (bigEnough != null) {
return bigEnough;
} else {
Arrays.sort(choices,new CompareSizeByArea());
return choices[0];
}
}