본문 바로가기

프로그래밍/iOS

[ios] AVCaptureSession에서 flash, focus 다루기

일반 UIImagePickerController를 사용하면

 

카메라에 접근할 수 있는 개체수가 한정되어 있다.

 

이로 인해 좀 더 깊게 접근 하려면 AVcaptureSession을 사용해야 한다.

 

UIImagePicker와는 다르게 CameraDevice에 접근하려면 device를 받아와 설정해줘야 한다.

 

1. flash

 

   Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice"); //디바이스 받아옴

    if (captureDeviceClass != nil) //디바이스를 제대로 가져온 경우에만 동작

   {

        if ([_videoDevice hasFlash]) //단말이 플래시를 가진 경우에만 실행

        {

            NSError *error = nil;

            [_videoDevice lockForConfiguration:&error]; //device에 설정권한 요청 

            if (flashOn) 

            {

                [_videoDevice setFlashMode:AVCaptureFlashModeOn]; //플래시 on

            

            else 

            {

                [_videoDevice setFlashMode:AVCaptureFlashModeOff]; //플래시 off

            }

            [_videoDevice unlockForConfiguration]; //설정 권한 반환

            

            if (error) //에러 출력 

            {

                NSLog(@"Cannot flash on with error : %@", [error localizedDescription]);

            }

        }

 

    }

 

위 에서 flashOn은 스위치를 통해 flash를 킬지 말지 결정하기 위한 bool변수이다.

실제로 중요한 부분은 주석으로 표시해 두었으니 필요한 부분만 참조하여 사용

 

2. focus

 

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

 

    NSError *error = nil;

    [device lockForConfiguration:&error];

    [device setFocusPointOfInterest:CGPointMake(0.5, 0.388)]; //화면 전체를 1로 잡아서 x,y 위치 

    //0, 0 이면 화면 좌측 상단, 1,1이면 화면 우측 하단, 0.5, 0.5면 화면 중앙

    [device setFocusMode:AVCaptureFocusModeContinuousAutoFocus]; //autofocus, on, off가 있음

    [device unlockForConfiguration];

    

    if (error) //에러 출력

   {

        LogDebug(@"Camera focus mode change failed.");

 

    }

 

flash와 같이 권한 요청하여 바꿀 수 있다.

포커스의 위치를 임의로 지정하여 포커스 시킬 수도 있다.