首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓相机2 api BufferQueue已被放弃。

安卓相机2 api BufferQueue已被放弃。
EN

Stack Overflow用户
提问于 2015-10-30 14:08:28
回答 3查看 16.4K关注 0票数 19

我正在使用新的Android camera2 API进行测试,我希望通过摄像头控制每一个帧。我所做的就是创建一个ImageReader并设置分辨率和图像格式。

代码语言:javascript
复制
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);

之后,我使用参数CaptureRequest创建了新的TEMPLATE_PREVIEW,并向他添加了imageReader目标。对于cameraCaptureSession,我使用此请求创建新的setRepeatingRequest

代码语言:javascript
复制
 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();
}

当我打开相机,开始查看我所拥有的预览,我会得到例外。但是在异常之前,我得到了一些预览图像,然后我有了异常。

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

发布于 2015-11-02 00:19:18

确保保存了对您创建的ImageReader的引用,可能是在定义了mSession的地方。

从ImageReader获得的曲面大致相当于一个弱指针--它不会阻止ImageReader收集垃圾。因此,很可能(根据您的命名),ImageReader正在被破坏,然后就会发生放弃错误。

票数 32
EN

Stack Overflow用户

发布于 2017-01-28 06:55:06

在我的应用程序中切换活动时,我遇到了同样的问题,这是在调用onSurfaceTextureDestroyed() (只返回false )之后发生的,但我所做的是将它更改为

代码语言:javascript
复制
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
            Log.e(TAG, "onSurfaceTextureDestroyed");
            if(cameraDevice != null){
                closeCamera();

                cameraDevice = null;
            }
            return false;
        }

这对我来说很管用。

票数 2
EN

Stack Overflow用户

发布于 2019-01-21 17:22:10

我找到了解决方案,这对我有效,感染的错误是在选择正确的大小,所以在使用MediaRecorder.setVideoSize()时使用此方法选择最佳大小

代码语言:javascript
复制
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];
        }

    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33437961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档