본문 바로가기

OnePIC (Android App)/카메라

[Camera2] 객체 초점 촬영 무한 로딩 현상 발생

반응형

사진 촬영 무한 로딩 현상 발생

lockFocus() 함수는 호출되었으나, captureStillPicture() 함수가 호출되지 않아 무한 대기 로딩하는 문제 발생

 
원인 파악해보니 위 흐름도에서 주황색 표시가 카메라 노출 상태가 캡처할 수 있는 상태가 아니라 captureStillPicture() 호출되지 않은 것이었다.
 

더 자세히 설명하자면 다음과 같다.

 

간단한 로직 설명
_
lockFocus() 호출을 통해 초점을 잠근 뒤 해당 상태 변경 완료됐을 때 콜백으로 captureCallback 함수가 호출되게 등록한다.
상태 변경되고 captureCallback.onCaptureCompleted() 함수가 호출되면, 결과 result를 process() 함수에 인자로 전달해 호출한다.
일련의 과정을 거쳐 state가 STATE_WAITING_PRECAPTURE 일 때, 카메라 노출 상태를 확인해 노출 상태가 PreCapture 상태이면 state를 STATE_WAITING_NON_PRECAPTURE로 변환한다.
state가 STATE_WAITING_NON_PRECAPTURE 일 때, 카메라 노출 상태를 확인해 노출 상태가 PreCapture 상태가 아니여야지 captureStillPicture() 함수가 호출되는 것이다.

 
로직 중 STATE_WAITING_NON_PRECAPTURE일 때, PreCapture 상태가 아니여야 실제 사진 촬영을 실행하는 captureStillPicture() 함수가 호출된다. 여기서 문제가 된 것이다. 
이때 계속해서 카메라 노출 상태가 PreCapture 상태였기 때문에, captureStillPicture() 함수가 호출되지 않는 것이었다.
 

PRECAPTURE 상태
: HAL이 PreCapture 시퀀스 중에 있는 상태로, 사진을 실제로 촬영하기 전에 미리 노출 설정을 준비하는 상태
AE 모드에 따라, 이 모드에서는 측광을 위해 플래시를 발광하거나 적목 현상 감소를 위해 플래시 펄스를 연속하여 발광할 수 있다.

 

PRECAPTURE 상태일 때 촬영을 안하는 이유 (captureStillPicture 함수를 부르지 않는 이유)

 
노출이 제대로 설정되지 않은 상태라고 판단하기 때문이다. 이 때 촬영을 하면 노출이나 조리개 설정 등이 적절하게 조정되지 않아 사진 품질이나 노출 조건이 원하는 대로 나오지 않을 수 있다. 특히 자동 노출(AE)을 사용하는 경우, 빛의 조건에 따라 노출이 제대로 이루어지지 않으면 과노출 또는 저노출된 이미지가 생성될 수 있다.
 
precapture 상태는 카메라 장치가 최적의 노출 조건을 찾기 위해 설정을 조정하는 중요한 단계이므로, precapture 상태를 건너뛰고 촬영하는 경우, 사진 품질이 저하될 수 있으므로 주의가 필요하기 때문이다.
 

PRECAPTURE 상태에서 다른 상태로 변경 방법

 
방법 1.
CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER 설정을 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_CANCLE 해서 어떤 상태든 INACTIVE로 설정한다.
 
→ 하지만 여전히 PRECAPTURE 상태에서 벗어나지 못했다.
    예상으로는 INACTIVE 상태에서 곧바로 PRECAPTURE 상태가 된 걸로 추정
 
방법 2.
CaptureRequest.CONTROL_AE_LOCK 설정을 true로 해서 상태를 LOCKED로 설정한다.
 
→ 하지만 여전히 PRECAPTURE 상태에서 벗어났지만 캡처가 여러번 된다.
    예상으로는 불러질 때마다 LOCK을 하니 완벽하게 불러졌을 때말고, 애매하게 불러졌을 때도 캡처가 되는 걸로 추정.
 
방법 3.
이러한 실패로 인해 결국 ObjectFocus일 때는 PreCapture 상태여도 촬영 가능하게 설정하기로 했다.
 
문제는 없는가? → 현재 상태에서 문제는 없는 것으로 판단

반응형