selfstarter

Android Camera2 본문

App/Android

Android Camera2

selfstarter 2020. 7. 25. 20:52

Camera API 자료

https://developer.android.com/guide/topics/media/camera?hl=ko

https://medium.com/google-developers/detecting-camera-features-with-camera2-61675bb7d1bf#.2x3icoqnc

Android Camera2 Class : https://developer.android.com/reference/android/hardware/camera2/package-summary.html

Camera2 특징

  • 기존에는 Camera 기능을 사용하기 위해 Intent를 사용했지만 따로 Classs를 세분화 시켜 좀 더 많은 기능을 추가
  • 더 빠른 간격으로 사진을 찍을 수 있음
  • 여러대의 카메라 사용 가능
  • 필터 효과 추가

사용법

1. 카메라 가져오기

모든 카메라에 접근이 가능하고, 카메라 Device 정보를 가지고 있는 CameraCharacteristics 객체를 얻을 수 있다

CameraManager manager = (CameraManager)getSystemService(CAMERA_SERVICE);
try {
	for (String cameraId : manager.getCameraIdList()) {
		CameraCharacteristics chars = manager.getCameraCharacteristics(CameraId);
	}
} catch (CameraAccessException e) {
	e.printStackTrace();
}

2. 특징 가져오기

CameraCharacteristics 객체로 카메라에 대한 정보를 가져올 수 있다

// Does the camera have a forwards facing lens?
Integer facing = chars.get(CameraCharacteristics.LENS_FACING);

Surface View란?

일반적으로는 화면을 그릴 때 onDraw를 자동으로 호출해서 화면이 늦게 그려지고 내가 원하는 타이밍에 그릴 수 없다. 하지만 SurfaceView는 스레드를 이용해 내가 원하는 때 바로 화면에 그릴 수 있다.(그러므로 애니메이션, 게임과 같이 화면이 빠르게 변하는 작업을 할 때 적합하다) SurfaceView는 더블 버퍼링을 사용하여 SurfaceHolder에 미리 그림을 그리고 그걸 SurfaceView에 적용시킨다

Camera Tutorial Example

https://inducesmile.com/android/android-camera2-api-example-tutorial/

  1. CameraManager class는 Android 기기의 카메라를 관리하는데 사용됩니다
  2. 각 카메라 기기는 기기를 설명하는 설정과 특정 범위를 가지고 있습니다. 이것을 camera characteristics를 통해 얻을 수 있습니다
  3. 카메라 기기로 부터 캡쳐나 동영상을 찍는 것은, 앱은 반드시 맨 첫번째로 camera capture session을 생성해야 합니다
  4. 프리뷰나 캡쳐의 결과 Surface가 카메라 캡쳐는 필요합니다.다양한 classes, including SurfaceView, SurfaceTexture via Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation, and ImageReader으로 부터 대상 Surface를 얻을 수 있습니다
  5. Application은 하나의 이미지 캡쳐를 위해 모든 parameter를 필요로 하는 CaptureRequest가 필요합니다
  6. 하나의 요청이 준비되면, 끝없이 반복하고 사용하거나 또는 하나의 캡쳐를 위해 각각 active capture session으로 넘깁니다
  7. 요청을 처리 한 후 카메라 장치는 캡처 시점의 카메라 장치 상태 및 사용 된 최종 설정에 대한 정보가 포함 된 TotalCaptureResult 객체를 생성합니다.

주요 Class

CameraManager : 디바이스의 카메라의 정보를 가지고 있다

CameraDevice : 현재 사용하는 카메라

CameraCaptureSession : 카메라에서 캡쳐된 이미지나 이전의 동일한 session에서 캡쳐한 이미지를 재 처리한다

CameraCharacteristics : CameraDevice의 속성. 불변이다

CaptureRequest : preview를 사용할 때 계속 capture를 요구

SurfaceTexture : OpenGL ES texture와 같은 image stream으로 부터 frame을 캡쳐한 결과물. 즉 이미지, 동영상의 캡쳐 결과물

CameraDevice.StateCallback : Camera Device의 상태를 업데이트 받기 위한 callback object. 시작, 종료, 에러 상태 등

CameraCaptureSession.CaptureCallback : Camera Device로 부터 완료된 CaptureRequest의 진행을 추적하기 위한 callback object. 캡쳐 완료 시 호출

ImageReader.OnImageAvailableListener : 새로운 이미지를 사용할 수 있을 때 호출. ImageReader로부터 사용할 수 있는 모든 새 frame에 대한 콜백

CameraCaptureSession.StateCallback : Camera capture session에 대한 상태가 변경되었을 때 호출됨

호출 순서

  1. [CameraDevice.StateCallback] onOpened : 카메라가 켜짐. 하는 기기의 카메라의 Camera Device를 얻는다.

  2. [createCameraPreview] : textureView의 버퍼 크기, textureView의 surface를 초기화한다. 그리고 Capture Session을 생성하는데 설정을 마쳤다면 CameraCaptureSession 상태 리스너의 onConfigured 함수를 호출한다.

  3. [updatePreview] : preview를 업데이트 한다. 컨트롤 모드(a3)를 설정한다.여기까지가 세팅

  4. [takePicture] : 이제부터 사진찍기 버튼을 눌렀을 때 순서이다. 현재 카메라 정보를 가져와서 저장할 이미지 정보를 세팅한다. 두개의 surfaceview를 생성하는데 하나는 imageReader, 다른 하나는 textureView의 것이다. 더블버퍼링 하는건가 싶음(내 추측)

  5. [cameraDevice.createCaptureSession]onConfigured : 사진 정보 설정 완료

  6. [captureListener]onCaptureCompleted : 카메라 캡쳐 완료. 또다시 preview를 업데이트한다

  7. [createCameraPreview] : 카메라 preview 정보 업데이트

  8. [takePicture]onImageAvailable : 이미지 저장. OnImageAvailableListener의 onImageAvailable 함수가 호출됨.

  9. [updatePreview] : preview를 업데이트 한다.

'App > Android' 카테고리의 다른 글

Lambda expressions are not supported at language level '7'  (0) 2020.08.07
Android Glide Library사용법  (0) 2020.07.31
Android image 저장  (0) 2020.07.22
갤러리에 이미지 저장  (0) 2020.07.22
Android Image Path 가져오기  (0) 2020.07.21
Comments