2014-01-12 2 views
0

라이브 카메라 미리보기에 SurfaceTexture를 사용하고 있습니다. 이렇게하면 데이터 스트림이 텍스처로 GPU에 직접 전송됩니다.Android camera surfaceTexture - 이전 프레임을 보존하는 방법?

이 질감은 각각의 새로운 카메라 프레임에 오는 덮어 씌우됩니다

을 지금 -. 나는이 덮어 쓰기를 방지하고 (내 궁극적 인 목표는 여기입니다) 메모리에 지난 수 (n)은 이전 프레임을 유지하려면

카메라의 데이터가 항상 n 개의 텍스처에서 가장 오래된 텍스처를 덮어 씁니다. 나는 그 (것)들 사이에서 교체 할 필요가있다.

이 텍스처는 데이터가 들어오는대로 즉시 렌더링에 사용할 수 있어야

내가 필요 없어요 :. 바이트 버퍼로 캡처 된 데이터를 저장하고 새로운 텍스처로 다시 변환 = 모두 실시간으로 천천히해야합니다 시각. 여기에 성과가 핵심입니다.

내가 surfaceTexture 모드에서 카메라를 실행하려면이 프로그램 예제를 사용했다

: 나는 attachToGLContext (INT의 texName) SurfaceTexture 클래스의 방법을 사용하여 새로운 질감을 연결하는 시도 http://maninara.blogspot.co.uk/2012/09/render-camera-preview-using-opengl-es.html

하지만에 나를 수있는 것 같지 않습니다

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

.. 나는 새를 부착하기 전에 "() detachFromGLContext"를 사용해야합니다 같은 이전을 파괴하지 않고, 보이는 것을 이해해야 어떤 도움을한다.

답변

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);

+0

라이브 텍스처는 .updateTexImage()에 의해 제공됩니다. 그래서 요약하면 : 1. onDraw : glGenTextures를 사용하여 저장할 텍스처의 빈 슬롯을 예약합니다. 2. 카메라 미리보기의 스트림이 이미지 데이터가 아닌 텍스처 형식으로 제공됩니다 (GLES11Ext.GL_TEXTURE_EXTERNAL_OES, hTex [0 ]). 따라서 glGetTexImage를 사용하여 다음을 사용하여 이미지 데이터 ("camera_data"라고 부름)에 대한 참조를 가져옵니다. glGetTexImage (GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0, format, type, camera_data)) 3. 단계를 수행합니다. 다음 프레임이 방금 저장 한 텍스처를 덮어 쓰지 않을까요? – Jayco

+0

여기서 무슨 일이 일어나는지 구별하는 것이 중요합니다. : 한 이미지의 데이터가 3MB라고 가정 해 보겠습니다. 카메라가 미리보기 텍스처를 피드하면 프레임 당 한 번만 3MB를 GPU로 이동하고 렌더링합니다 (카메라 캡처 -> 3MB 이동 -> GPU 렌더링). 이 모든 프레임 보존 작업을 수행 할 때 다음과 같은 작업을 수행 할 수 있습니다. 3MB 데이터에 대한 참조를 이동 하시겠습니까? (정확히 원하는 것입니다) 이렇게 : (카메라 캡쳐 -> 3MB 이동 -> GPU 렌더 -> 3MB로 유지 & 보존) 아니면 실제로 3MB를 한 번 이상 옮깁니 까? 이렇게 : (카메라 캡처 -> 3MB 이동 -> GPU 렌더 -> 3MB를 다시 텍스쳐로 이동) Thx – Jayco

+0

1. 예, glGenTextures를 사용하여 텍스처가 저장 될 슬롯을 확보하십시오. 2. 사용하지 않았습니다. 전에 glGetTexImage, 나는 네 길을 생각한다. 3. glActiveTexture와 glBindTexture를 사용하여 덮어 쓸 슬롯을 선택하십시오.따라서 덮어 쓰지 않으려는 슬롯을 예약 할 수 있습니다. 4. glGetTexImage를 호출 할 때 (3MB 이동 - 텍스처 가져 오기) 프로세스가 발생한다고 생각하므로 동일한 프레임에서 glGetTexImage를 다시 호출하지 않으면 3MB 이동이 프레임 당 한 번 수행됩니다. – gloompisces