Android相机surfaceTexture - 如何保留以前的帧?

时间:2014-01-12 21:36:35

标签: android opengl-es camera textures

我正在使用SurfaceTexture进行实时相机预览。这会将数据流作为纹理直接发送到GPU。

每个新相机框架都会覆盖此纹理。

现在 - 我想避免这种覆盖,并在内存中保留最后几个(n)前一帧(这是我的最终目标)

来自相机的数据总是会覆盖n个可用纹理中最古老的纹理。我只需要在它们之间交替。

当数据进入时,这些纹理需要立即呈现。

我不需要:将捕获的数据保存为字节缓冲区并将其转换回新纹理=慢速,所有都必须是实时的。性能是关键所在。

我使用此程序示例以surfaceTexture模式运行相机:http://maninara.blogspot.co.uk/2012/09/render-camera-preview-using-opengl-es.html

我试图使用SurfaceTexture类的attachToGLContext(int texName)方法附加一个新纹理,但它似乎不允许我这样做而不破坏前一个,似乎我必须在附加之前使用“detachFromGLContext()”一个新的..

http://developer.android.com/reference/android/graphics/SurfaceTexture.html

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

如何将数据流发送到纹理?

就我而言,我在onSurfaceCreated中创建了多个纹理。然后在onDraw中覆盖它们。整个过程是实时的,不需要帧缓冲来存储数据。

onDraw中,我使用glActiveTextureglBindTexture来选择要覆盖的纹理。 这是代码,希望它有所帮助。

GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + texture_index); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, m_texture[texture_index]); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, m_frame.width, m_frame.height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, camera_data);