BufferQueue has been abandoned解决方案
项目中有个需求,不显示预览的情况下获取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解决方案相关推荐
- [ Android实战 ] android query: BufferQueue has been abandoned 问题解决
[ Android实战 ] android query: BufferQueue has been abandoned 问题解决 背景 日志分析 参考资料 解决方案 源码分析 总结 尊重原创,转载请注 ...
- 安卓框架,分析项目中surfaceFlinger出现的bug ---queueBuffer: BufferQueue has been abandoned
学习android graphic很好的系列文章:https://blog.csdn.net/lewif/article/details/50526494 GlSurfaceview和egl的相关文章 ...
- Camera2报错: BufferQueue has been abandoned
使用Camera2的时候以下错,导致照相不能连拍: E/BufferQueueProducer: [ImageReader-1280x720f23m1-31435-0](id:7acb00000001 ...
- BufferQueue has been abandoned
android Camera不显示预览获取帧数据 https://www.jianshu.com/p/9a51270b69ea 使用该例子程序,运行总是报如题错误. 将用于预览的SurfaceText ...
- 【Android】Android SurfaceFlinger之BufferQueue
在Android中,BufferQueue是Surface实现本地窗口的关键,驻留在SurfaceFlinger进程中进行服务,下面从BufferQueue的结构开始分析. 1.BufferQueue ...
- androidP Surface到SurfaceFlinger -->surface -> BufferQueue(一)
BufferQueue 前言 介绍 BufferQueue::createBufferQueue 前言 结合前面的一篇文章创建Surface, 我们知道最后会调用到SurfaceFlinger的Cre ...
- 基于GLSurfaceView的视频播放器偶现无画面的问题分析
文章目录 一. 问题背景 二. 逐步排查 2.1 增加log,复现问题 2.2 查看ijkplayer源码 2.3 查看AOSP源码 三. 分析原因 3.1 Renderer回调onSurfaceCr ...
- android穿山甲主题冲突,Flutter 接头条穿山甲广告 Android 总述篇
接入流程 一.按照穿山甲文档,接入穿山甲Android sdk,配置gradle 文件等,保证Android代码中可以调用穿山甲 sdk,并注册 二.在Android端创建PlatformView , ...
- virtual camera
敲下标题的这一刻,内心还是有点儿小激动的.毕竟虚拟摄像头,也做了几个星期了,硬生生的在android原生系统不支持的情况下,绕过重重限制,完美的实现了这一功能.接下来几天,终于可以睡个好觉了. 好了, ...
最新文章
- [C] Bellman-Ford边松弛:解决负权边
- Emacs 使用YASnippet
- 250相当于什么显卡_2K(4K)144hz显示器需要什么显卡来带? 本文将给你答案。
- Scala入门到精通——第二十二节 高级类型 (一)
- 【开源程序(C++)】获取bing图片并自动设置为电脑桌面背景
- 月薪一万在石家庄能过什么样的生活?
- 单机实验mysql的主从备份(master slaver)
- 关于lua字节码在32位和64位系统上不兼容的问题
- 分享国外安全团队及工具
- c语言单片机秒表程序,单片机秒表程序
- 系统操作手册_辽宁高考志愿填报系统2019操作手册(考生版)
- 在线查看计算机配置,怎样查看电脑配置信息?
- 去除Ubuntu 20桌面图标的快捷方式箭头
- java设置拨号界面_JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
- 对话亚洲高校首个博士论文奖-裘捷中丨KDD2022
- 字符串右移n位,例如 “hello world“ 右移两位 后ldhello wor
- 非计算机专业考计算机三级难吗,经验之谈:怎样通过计算机等级考试三级考试...
- Mysql的索引、视图、触发器、存储过程
- matlab 画图 断层显示,MATLAB编程实现连续断层工业CT图像的三维重建_张爱东
- Leetcode210-课程表II