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