GLSurfaceView with Camera2
GLSurfaceView로 카메라 영상을 나타내는것은 MediaPlayer로 동영상 플레이어 만드는 법과 비슷합니다. 기본적인 흐름은 이렇습니다.
Note:카메라를 사용하기 위해 메니페스트에 해당 퍼미션 사용을 선언하고, 런타임 퍼미션을 체크합니다.
카메라를 열고 프리뷰세션을 만들어 캡쳐리퀘스트를 반복적으로 수행하는것은 이전 포스트인 카메라2에서 확인하실 수 있습니다.
이번 포스트의 핵심은 GLThread에서 생성한 텍스처를 이용하여 Surface를 생성해내는 것입니다.
먼저 Texture를 만들도록합니다.
int textures[] = new int[1]; GLES20.glGenTextures(1, textures, 0); int textureId = textures[0]; GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
이렇게 생성한 텍스처를 이용해 Surface로 만듭니다.
SurfaceTexture surfaceTexture = new SurfaceTexture(textureId); Surface surface = new Surface(surfaceTexture);
이렇게 만들어진 surface를 카메라의 타겟으로 지정하여 이미지 버퍼를 받아 처리합니다.
mCameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { ... CaptureRequest.Builder mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mPreviewRequestBuilder.addTarget(surface); mPreviewRequest = mPreviewRequestBuilder.build(); mCaptureSession.setRepeatingRequest(mPreviewRequest, null, mBackgroundHandler); ... } }, null );
본 프로젝트의 소스코드는 github에서 확인 하실 수 있습니다.
0개의 댓글