맥용 페이스타임 카메라를 컨트롤 해 보려고 하는 삽질을 어제 저녁부터 밤까지 했는데,
그 기록을 남겨봅니다.
배경
온라인 개학 때문에 웹캠 대란. 가격이 뛰고 그마저도 재고가 없음.
맥용 페이스타임 카메라 있긴 한데, 사용해 보니 불만족.
노출 고정이 안되고 무엇보다 화이트 밸련스가 계속 바뀌어서 보기가 풀편함.
자료조사
유료 앱이 맥앱스토어에 있긴한데, $8. 거의 만원.
각종 필터가 제공되지만, 필터가 필요했던 건 아님.
저 가격의 앱이면 차라리 저가형 웹캠을 사는 게 낫다는 판단.
AVFoundation을 통해 페이스타임 카메라에 접근하면 가능하지 않을까? 막연히 생각.
발단
그냥 웹 캠을 구매하려고 했는데, 알리에도 재고가 없다는 걸 확인.
BRIO 급의 웹캠은 30만원 호가.
일단 웹 캠 가격이 안정화 되기 전까지는 페이스타임 카메라로 버텨야 하나??
AVFoundation 샘플 코드를 보면서 일단 진행
전개
func setUpCam(){
captureSession = AVCaptureSession()
captureSession.sessionPreset = AVCaptureSession.Preset.high
cameraDevice = AVCaptureDevice.default(for: .video)
//unlock here
guard let videoDeviceInput = try? AVCaptureDeviceInput(device: cameraDevice) else {return}
try? cameraDevice.lockForConfiguration()
if cameraDevice.isWhiteBalanceModeSupported(.locked) {
cameraDevice.whiteBalanceMode = .locked
}
if cameraDevice.isExposureModeSupported(.locked) {
cameraDevice.exposureMode = .locked
}
cameraDevice.unlockForConfiguration()
if captureSession.canAddInput(videoDeviceInput) {
captureSession.addInput(videoDeviceInput)
}
captureSession.commitConfiguration()
captureVideoLayer = AVCaptureVideoPreviewLayer(session: captureSession)
captureVideoLayer.frame = self.view.bounds
captureVideoLayer.videoGravity = AVLayerVideoGravity.resizeAspect
self.view.layer?.addSublayer(captureVideoLayer)
captureSession.startRunning()
}
코드는 엄청 단순. 하지만 맥 앱 개발 환경을 다 까먹음.
난관 1
레이어가 표시되지 않음. 이유를 모르겠음.
1시간동안 삽질을 하다가 발견한 설정
iOS의 UIView 와 달리 macOS의 NSView 는 저 옵셥을 켜 줘야 레이어 사용 가능.
카탈리스트는 저 옵션 필요 없음.
난관 2
cameraDevice.whiteBalanceMode = .locked
가 mac의 페이스타임 카메라에서는 안 먹는 상황.
lock을 했을 때, 에러는 안 나지만 화이트 밸련스는 계속 바뀜.
cameraDevice.whiteBalanceMode = .autoWhiteBalance
로 하면 앱이 크래시 남. 저 설정은 최초 자동으로 WB 맞춘뒤 고정시키는 옵션.
참고로 디폴트 값은
cameraDevice.whiteBalanceMode = .continuousAutoWhiteBalance
예상 해결방법
앱 만들어 올린 놈이 있는 걸 보면 어떻게든 해결방법은 있을 것임.
단지 AVFoundation은 비교적 high level API 이고,
저 메소드는 iOS 용으로 만든 걸 mac에서 코드 호환성을 위해 그냥 남겨둔 듯.
맥 페탐 카메라는 초점 조절을 위한 UI가 없으니 기능도 구현하지 말라는 건가?
IOKit등을 통해 페이스타임 카메라에 보다 low level 한 접근을 해서
레지스트리 값 변경을 하면 가능할 것으로 예상되나…
먹고사니즘 때문에 이대로덮을 것인가?
아니면 걍 파고 들어서 앱 스토어에 $2 정도에 올릴까? 고민 중
나중에 또 필 받아 달리게 되면 업뎃 하겠음돠.