【发布时间】:2015-09-24 00:18:12
【问题描述】:
在 Android 中,我需要一种有效的方法来修改相机流,然后再将其显示在屏幕上。 This post 讨论了几种方法,我能够实现第一种:
- 从 onPreviewFrame 获取帧缓冲区
- 将帧转换为 YUV
- 修改框架
- 将修改后的帧转换为 jpeg
- 显示框架到放置在 SurfaceView 上的 ImageView 用于 预览
这很有效,但将我通过常规相机预览获得的 30 fps 降低到了 5 fps 左右。从不同的图像空间来回转换帧也很耗电,这是我不想要的。
是否有示例说明如何直接访问原始帧而不必进行如此多的转换?使用 OpenGL 是正确的方法吗?这一定是一件很常见的事情,但我找不到很好的例子。
注意:为了向后兼容,我宁愿避免使用 Camera2 API。
【问题讨论】:
-
您尝试进行哪些修改?使用 GLES 操作有些事情非常简单,有些事情很尴尬。一个例子:youtube.com/watch?v=kH9kCP2T5Gg
-
我需要应用一些必须在 CPU 上而非 GPU 上运行的专有信号处理链(用 C 编写)。
-
如果你的代码必须在 CPU 上运行,那么你就不能使用 OpenGL ES(根据定义,除非你是 Mesa 的忠实粉丝)。您可以使用 ImageReader (developer.android.com/reference/android/media/ImageReader.html) 从 Surface 直接访问 YUV 数据,避免初始缓冲区复制和 RGB 转换,但这需要 API 19+。
-
不能使用 OpenGL 写入内存,然后可以从 CPU 访问吗?基本上,我正在寻找 CPU 密集度最低的数据流,允许在显示之前修改原始相机数据。
-
之前您说您有用 C 编写的代码必须在 CPU 上运行,而您的问题表明它需要在 YUV 中。 ImageReader 路径使您能够以很少的开销 CPU 访问 YUV 数据(它抽象出平面/半平面格式和对齐偏移)。除非你可以在 GPU 上进行处理,否则你不会做得更好。顺便说一句,你为什么将帧转换为 JPEG?你把它存放在某个地方吗?这会花费你不少钱。
标签: android opengl-es android-camera