无法从android相机获取输出缓冲区

Posted

技术标签:

【中文标题】无法从android相机获取输出缓冲区【英文标题】:Can't get output buffer from android camera 【发布时间】:2020-07-22 04:47:08 【问题描述】:

我正在与android Camera2 API 合作,并在使用 Android 6.0 (API 23) 的智能手机从相机上获取一组照片后得到这个:

2020-04-09 20:36:58.556 260-9342/? E/Camera3-Stream: getBuffer: wait for output buffer return timed out after 3000ms
2020-04-09 20:36:58.556 260-9342/? E/Camera3-Device: RequestThread: Can't get output buffer, skipping request: Connection timed out

发生此错误后,相机阻塞,图像停止发送,我需要重新打开 CameraDevice 以获取一组新图像。

我正在使用 BackgroundHandler 来处理在 BackgroundThread 中获取相机图像。然后我创建额外的 BackgroundThread 来使用 OpenCV 库函数处理每个图像。但是,我同时只有一个额外的 BackgroundThread 工作。 (有些图片我会省略,只有在没有其他类似线程的情况下才会创建一个新线程。)

为了获取图像,我使用 CameraCaptureSessionsetRepeatingRequest 函数。而且我在处理之前对每个图像缓冲区进行了克隆。所以,我的问题是为什么会发生错误以及如何克服它?

【问题讨论】:

【参考方案1】:

你在读完每个缓冲区后是否调用Image.close()?

您的 ImageReader 中只有固定数量的缓冲区,如果您不将图像返回到队列(通过关闭它们),您最终会停止捕获管道。

如果您只是删除对 Image 的所有引用,它最终会被垃圾回收并返回到队列中,但这可能需要比您预期的更长的时间,因此手动关闭它更可靠。

【讨论】:

所以,我发现你的建议有一个小错误,谢谢你。但是当我在图像缓冲区复制相同的故事重复之后调用 Image.close() 方法时。近 20 秒后,相机再次被遮挡。在每个捕获请求之后调用 CameraCaptureSession.close() 并不是一个优雅的解决方案(如果使用 CameraCaptureSession.capture())。也许有更有效的方法来清除图像缓冲区? 另外,我有办法在调用 CameraCaptureSession.capture() 之前调用 CameraCaptureSession.abortCaptures() 来避免阻塞,但这是一个棘手的变体,它无助于以更高的速率获取图像(4例如,FPS 已经无法在我的设备上运行)。 然后还有一些其他问题 - 预计相机不会在几秒钟后阻塞。我不知道你为什么要调用 abortCaptures(),但它预计会阻塞,直到相机管道被清除,并且没有办法改变它。

以上是关于无法从android相机获取输出缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JNI 在 C 中获取原始 Android 相机缓冲区?

相机直接到 iOS 上的 OpenGL 纹理

Python多处理,从没有缓冲区的远程RTSP相机读取

从相机获取 yuv 平面格式图像 - iOS

截图 相机视图+布局视图 android 增强现实

我们如何从 iPhone 相机中获取 H.264 编码的视频流?