项目中有个需求,不显示预览的情况下获取Camera的图像数据,找了一下资料发现SurfaceTexture这个类可以实现该功能。于是用SurfaceTexture实现了一下,核心代码片段如下:

private void setupVisCamera() {try {SurfaceTexture surfaceTexture = new SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);//注意此行,会产生问题final int bufferSize = cameraConfig.getVisOriginalWidth() * cameraConfig.getVisOriginalHeight() * 3 / 2;vis_camera = Camera.open(cameraConfig.DEF_VIS_CAMERA_ID);vis_camera.setPreviewTexture(surfaceTexture);vis_camera.addCallbackBuffer(new byte[bufferSize]);vis_camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {if (null == data) {Log.d("Camera", "可见光预览为空值!!!!!!!!");vis_camera.addCallbackBuffer(new byte[bufferSize]);} else {vis_camera.addCallbackBuffer(data);cameraConfig.visYuvData = data;//图像数据赋值到cameraConfig中Log.d("Camera", "可见光预览中______");}}});vis_camera.startPreview();//开始预览} catch (IOException e) {e.printStackTrace();}}

在运行后只获取了一帧数据,然后就产生了以下错误,导致不能在onPreviewFrame中继续获取图像数据:

 E/BufferQueueProducer: [unnamed-17383-0] queueBuffer: BufferQueue has been abandonedE/BufferQueueProducer: [unnamed-17383-0] dequeueBuffer: BufferQueue has been abandoned

为了解决这个问题,找了好多资料未果,后来在stackoverflow上找到了一篇提问"SurfaceTexture has been abandoned",和我的情况类似,在Danny的回答中写到

The short answer: Keep a reference to your SurfaceTexture so that the object doesn’t get garbage collected (and thereby abandoned).
简单回答一下:保持持有一个SurfaceTexture的引用,如此一来该对象就不会被当做垃圾回收(从而被弃用)


I made a simple change to make the SurfaceTexture a member object of my class, and now the “SurfaceTexture has been abandoned” error is gone - and my preview continues to deliver frames via onPreviewFrame().
我做了一个小改动,把SurfaceTexture 作为类中的成员变量,然后就不再报错了,并且通过onPreviewFrame()方法可以继续获取预览帧了

再回看我写的代码,在方法体内new了一个surfaceTexture ,该对象的生命周期在try中,当try结束后,该对象不被持有,随后就会被标记为垃圾回收掉,而vis_camera.setPreviewTexture(surfaceTexture);只是一个传址引用,并不是真正意义上的持有这个surfaceTexture。因此,按照上述回答,我也把我的surfaceTexture 提升为了成员变量,这样一来就不再出现BufferQueue has been abandoned的问题了。改正后的代码如下:

private SurfaceTexture surfaceTexture = new SurfaceTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);//提升为成员变量
private void setupVisCamera() {try {final int bufferSize = cameraConfig.getVisOriginalWidth() * cameraConfig.getVisOriginalHeight() * 3 / 2;vis_camera = Camera.open(cameraConfig.DEF_VIS_CAMERA_ID);vis_camera.setPreviewTexture(surfaceTexture);vis_camera.addCallbackBuffer(new byte[bufferSize]);vis_camera.setPreviewCallbackWithBuffer(new Camera.PreviewCallback() {@Overridepublic void onPreviewFrame(byte[] data, Camera camera) {if (null == data) {Log.d("Camera", "可见光预览为空值!!!!!!!!");vis_camera.addCallbackBuffer(new byte[bufferSize]);} else {vis_camera.addCallbackBuffer(data);cameraConfig.visYuvData = data;//图像数据赋值到cameraConfig中Log.d("Camera", "可见光预览中______");}}});vis_camera.startPreview();//开始预览} catch (IOException e) {e.printStackTrace();}
}

BufferQueue has been abandoned解决方案相关推荐

  1. [ Android实战 ] android query: BufferQueue has been abandoned 问题解决

    [ Android实战 ] android query: BufferQueue has been abandoned 问题解决 背景 日志分析 参考资料 解决方案 源码分析 总结 尊重原创,转载请注 ...

  2. 安卓框架,分析项目中surfaceFlinger出现的bug ---queueBuffer: BufferQueue has been abandoned

    学习android graphic很好的系列文章:https://blog.csdn.net/lewif/article/details/50526494 GlSurfaceview和egl的相关文章 ...

  3. Camera2报错: BufferQueue has been abandoned

    使用Camera2的时候以下错,导致照相不能连拍: E/BufferQueueProducer: [ImageReader-1280x720f23m1-31435-0](id:7acb00000001 ...

  4. BufferQueue has been abandoned

    android Camera不显示预览获取帧数据 https://www.jianshu.com/p/9a51270b69ea 使用该例子程序,运行总是报如题错误. 将用于预览的SurfaceText ...

  5. 【Android】Android SurfaceFlinger之BufferQueue

    在Android中,BufferQueue是Surface实现本地窗口的关键,驻留在SurfaceFlinger进程中进行服务,下面从BufferQueue的结构开始分析. 1.BufferQueue ...

  6. androidP Surface到SurfaceFlinger -->surface -> BufferQueue(一)

    BufferQueue 前言 介绍 BufferQueue::createBufferQueue 前言 结合前面的一篇文章创建Surface, 我们知道最后会调用到SurfaceFlinger的Cre ...

  7. 基于GLSurfaceView的视频播放器偶现无画面的问题分析

    文章目录 一. 问题背景 二. 逐步排查 2.1 增加log,复现问题 2.2 查看ijkplayer源码 2.3 查看AOSP源码 三. 分析原因 3.1 Renderer回调onSurfaceCr ...

  8. android穿山甲主题冲突,Flutter 接头条穿山甲广告 Android 总述篇

    接入流程 一.按照穿山甲文档,接入穿山甲Android sdk,配置gradle 文件等,保证Android代码中可以调用穿山甲 sdk,并注册 二.在Android端创建PlatformView , ...

  9. virtual camera

    敲下标题的这一刻,内心还是有点儿小激动的.毕竟虚拟摄像头,也做了几个星期了,硬生生的在android原生系统不支持的情况下,绕过重重限制,完美的实现了这一功能.接下来几天,终于可以睡个好觉了. 好了, ...

最新文章

  1. [C] Bellman-Ford边松弛:解决负权边
  2. Emacs 使用YASnippet
  3. 250相当于什么显卡_2K(4K)144hz显示器需要什么显卡来带? 本文将给你答案。
  4. Scala入门到精通——第二十二节 高级类型 (一)
  5. 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景
  6. 月薪一万在石家庄能过什么样的生活?
  7. 单机实验mysql的主从备份(master slaver)
  8. 关于lua字节码在32位和64位系统上不兼容的问题
  9. 分享国外安全团队及工具
  10. c语言单片机秒表程序,单片机秒表程序
  11. 系统操作手册_辽宁高考志愿填报系统2019操作手册(考生版)
  12. 在线查看计算机配置,怎样查看电脑配置信息?
  13. 去除Ubuntu 20桌面图标的快捷方式箭头
  14. java设置拨号界面_JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
  15. 对话亚洲高校首个博士论文奖-裘捷中丨KDD2022
  16. 字符串右移n位,例如 “hello world“ 右移两位 后ldhello wor
  17. 非计算机专业考计算机三级难吗,经验之谈:怎样通过计算机等级考试三级考试...
  18. Mysql的索引、视图、触发器、存储过程
  19. matlab 画图 断层显示,MATLAB编程实现连续断层工业CT图像的三维重建_张爱东
  20. Leetcode210-课程表II

热门文章

  1. 高性能电工电子电气控制技术实训考核装置
  2. 利用photoprism搭建私有云相册
  3. quick-cocos2d-x 飞机大战(打飞机)小demo教程------主角飞机类
  4. 多邻国(Duolingo)内推,来了!
  5. 年会也能互联网+ 易信企业版玩投票抽奖
  6. IIS如何防ASP木马
  7. 【WinHex篇】WinHex只读模式(写保护)设置
  8. 如何最大效率压缩视频文件(ffmpeg)
  9. password has expired问题
  10. html实现多图片上传并预览,【前端预览】实现多张上传图片预览查看