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:)에 넣으면
간단하게 이미지를 보여줄 수 있어요
'iyOmSd > Title: Swift' 카테고리의 다른 글
[Swift] DateFormatter 년도차이 YYYY vs yyyy (2) | 2021.01.02 |
---|---|
[Swift] 커스텀 연산자 만들기 (Custom Operator) (0) | 2020.12.31 |
[Swift] Socket 라이브러리 비교 CocoaAsyncSocket vs Socket.IO (0) | 2020.12.23 |
[Swift] AutoLayout 코드작성방법 (Visual Format Language, NSLayoutAnchor, NSLayoutConstraint) (0) | 2020.11.27 |
[Swift] Hugging, Resistance (0) | 2020.11.25 |