目前我正在屏幕上显示相机预览,提供相机预览纹理 - camera.setPreviewTexture(...)
(当然是使用 opengl 进行)。
我有一个本地库,它获取 bytes[]
作为图像,并返回 byte[]
- 与输入图像相关的结果图像。我想调用它,然后将输入图像和结果绘制到屏幕上 - 彼此叠加。
我知道在 Opengl 中,为了将纹理数据返回到 CPU 中,我们必须使用 glReadPixel
读取它,并且在处理之后我必须将结果加载到纹理中 - 这每帧都将对性能产生重大影响。
我考虑过使用 camera.setPreviewCallback(...)
,我正在获取框架(调用处理方法并将结果传输到我的 SurfaceView),然后并行继续使用用于在屏幕上绘制的纹理预览技术,但我担心在 previewCallback
中获得的帧与我在纹理中获得的帧之间同步。
我错过了什么吗?或者没有简单的方法来解决这个问题?
最佳答案
一种可能有用的方法是将相机的输出定向到 ImageReader。 ,它提供了一个表面。发送到 Surface 的每一帧都作为 YUV 数据提供,无需副本,这使得它比某些替代方案更快。颜色格式(步幅、对齐、交错)的变化由 ImageReader 处理。
由于您希望相机图像与处理输出同时呈现,因此您不能沿着两条独立的路径发送帧。
框架准备就绪后,您需要进行颜色空间转换并使用 glTexImage2D()
上传像素。这可能是性能限制因素。
从评论来看,您似乎很熟悉使用 fragment 着色器进行图像过滤;对于发现此问题的任何其他人,您可以查看示例 here .
关于android - CPU 处理相机图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35343000/