iyOmSd/Title: Swift

[Swift] AVFoundation 카메라 만들어보기(기초)

냄수 2020. 12. 24. 22:48
반응형

UIImagePickerController를 이용해서

아주 손쉽게 카메라를 띄우고 사진을 가져오는 방법이 있지만

더 많은 컨트롤을 할 수 있는

AVFoundation을 다뤄서 만들어 보도록할거에여

 

AVFoundation으로 할 수 있는 것은

카메라, 비디오, 오디오, 녹음, 미디어에셋을 커스텀 하게 만들 수 있어요

 

 

간단한 원리라고하면

Device에서 어느 장치를 쓸건지 input을 만들어서

동작하는 Session에 넣어주고

넣은 input이 있으면 그에따른 output도 있겠죠?

output도 설정해서 Session에 달아주면 되는식이에요

 

요약하자면 input, output을 session에 설정한다!

 

코드로 보면서 이해해볼까요 (간단해서 볼것도 없네요.. ㅎ)

class TestCamera: UIViewController {
    private lazy var captureDevice = AVCaptureDevice.default(for: .video)
    private var session: AVCaptureSession?
    private var output = AVCapturePhotoOutput()
    
    override func viewDidLoad() {
        settingCamera()
    }
    
    func settingCamera() {
        guard let captureDevice = captureDevice else { return }
        
        do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            session = AVCaptureSession()
            session?.sessionPreset = .photo
            session?.addInput(input)
            session?.addOutput(output)
        } catch {
            print(error)
        }
        guard let session = session else { return }
        
        let previewLayer = AVCaptureVideoPreviewLayer(session: session)
        previewLayer.frame = view.frame
        view.layer.addSublayer(previewLayer)
        session.startRunning()
        
    }
}

device를 설정해주고 

input을 만들어주고

sessionPreset: output의 퀄리티를 지정해주는 옵션이에요

AVCaptureVideoPrevieLayer를 통해서 카메라가 영상으로 현재 찍고있는 물체를 보여주고요

 

사진을 찍는 동작은

captureOutput?.capturePhoto(with: .init(), delegate: delegate)

delegate는 AVCapturePhotoCaptureDelegate를 준수해주시면대요

delegate에 많은 메서드들이 있는데

원하는 타이밍에 따라 사용할 수 있는 메서드를 골라서 이용하면돼요

 

제일 처음에 호출되는 이 메서드는 셔터소리가 나기전에 호출되는 함수죠

라이브포토를 이용할 때 주로 사용하는 메서드같네여...

라이브포토를 찍을때 누르고나서 살짝 뒤에 소리가 나죠?

데이터는 버튼을 누르고 셔터 소리전까지 저장되어서 움직이는 사진이 저장되죠

그런 동작인것 같아요

 

셔터소리 이후 바로 호출되는 메서드에요

플래시를 적용할 수 있는 곳에 적합한거 같아요

깜빡거리는 효과나 찍은 사진을 잠시 보여줄 수 있을 것 같아요

 

이팩트나 depth data? 3d사진인가 아무튼 입체사진? 그런 작업을 끝낸 상태라네요

 

모든 동작이 끝나면 호출되는 메서드에요

 

 

저는 didFinishProcessingPhoto를 이용해서

찍힌 이미지데이터를 이용했구요

extension TestCamera: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        let data = photo.fileDataRepresentation()
    }
}

 

data를 UIImage(data:)에 넣으면 

간단하게 이미지를 보여줄 수 있어요

 

 

반응형