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에서 확인 하실 수 있습니다.

카테고리: Graphics

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.