Android SDK如何获取原始预览相机图像而不显示它?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (95)

我想用原始图像进行图像处理而不显示在屏幕上,这显然会降低性能。

如果在Android 1.5中是不可能的,但是有人知道在Android 4(API级别15)中是否可能?

提问于
用户回答回答于

在Android 4中,接收原始图像数据而不显示在屏幕上的最简单的方法是使用Camera.setPreviewTexture()调用将预览帧路由到GPU。

你可以通过两种方式使用它:

  1. 在GPU上执行实际处理:设置OpenGL上下文,并在该上下文中创建SurfaceTexture对象。然后将该对象传递给setPreviewTexture,并开始预览。然后,在您的OpenGL代码中,您可以调用SurfaceTexture.updateTexImage,并将与SurfaceTexture关联的纹理ID更新为摄像头的最新预览帧。如果需要,您还可以使用glReadPixels将RGB纹理数据读回CPU以作进一步处理。
  2. 在CPU上进行处理:您可以简单地创建一个虚拟SurfaceTexture对象,而无需设置任何OpenGL上下文。将所需的任何整数作为纹理ID传递,并使用setPreviewTexture将SurfaceTexture连接到相机。只要您不调用updateTexImage,SurfaceTexture将简单地丢弃相机传递给它的所有数据。然后使用setPreviewCallback设置预览回调,并将该数据(通常以YUV格式)用于CPU处理。这可能比#1效率低,但不需要知道OpenGL。
用户回答回答于

你需要在NDK中使用它,因为使用Java接口会消除任何性能优势。从性能的角度来看,与PixelBuffer一起工作绝对是疯狂的。从RGBA888到YUV的转换也需要在C中完成。

不要尝试使用TextureView,因为它会更糟糕。在转换为YUV之前,你必须将像素复制到位图中,然后从位图复制到阵列中。这本身就占据了新品Nexus 7 2013品牌几乎30%的CPU利用率。

最有效的方法是直接与Camera.h交谈并绕过所有Android API。你可以创建自己的缓冲区并在YUV数据到达任何其他位置之前拦截YUV数据。

扫码关注云+社区