스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
응답성이 뛰어난 카메라 경험 만들기
AVCapture와 PhotoKit을 사용하여 응답성이 뛰어나고 쾌적한 앱을 만들어 보세요. 카메라 캡처 과정을 알아보고 지연 사진 처리를 활용하여 고품질 사진을 만드는 기술을 소개합니다. 제로 셔터 랙으로 시간을 거슬러 올라가 완벽한 액션 사진을 담아내고, 응답성 캡처 파이프라인을 구성하는 법을 확인해 보세요. Video Effects API를 사용하여 실시간 비디오 효과를 입히는 사전 정의된 제스처를 인식하는 방법을 살펴봅니다.
리소스
관련 비디오
WWDC20
-
다운로드
안녕하세요 전 카메라 소프트웨어 팀의 롭 시무티스고, Photos 팀의 서배스천 머디나와 함께합니다 오늘 저희 세션은 '응답성이 뛰어난 카메라 경험 만들기'입니다 AVFoundation 캡처 클래스와 PhotoKit 프레임워크에 새로 도입된 강력한 API를 소개해 드리겠습니다 우선 지연 사진 처리를 알아보겠습니다 이어서 진정한 '순간 포착'을 보여 드리죠 제로 셔터 랙으로요 다음은 응답형 캡처 API를 설명해 드리겠습니다 마지막으로는 새로 업데이트된 비디오 효과에서 다양한 방법으로 응답성을 올려 보겠습니다 여러분은 iOS 13부터 AVCapturePhotoSetting의 photoQualityPrioritization 열거형 값으로 응답성을 바꾸거나 사진을 캡처해서 처리한 후 다음 사진을 찍을 수 있을 때까지 걸리는 시간을 변경할 수 있었습니다 여러분의 앱에서 열거형 값을 변경하면 응답성을 조절할 수 있지만 이미지 품질에 영향을 끼치죠 항상 높은 품질을 사용하려 하면 촬영과 촬영 사이의 간격이 길어집니다 iOS 17에서도 이 API는 계속 지원됩니다 그러나 저희가 제공하는 새로운 보완 API를 사용하면 고품질 사진을 촬영하는 것과 동시에 원하는 순간을 담을 수 있죠 이번 세션을 위해 저희가 만든 앱을 살펴보겠습니다 토글 스위치를 '켜기'로 전환하면 올해의 새 기능을 활성화할 수 있는데요 한 가지씩 살펴보며 응답성이 뛰어난 사진 경험을 알아보겠습니다 그럼 지연 사진 처리부터 시작해 보죠 현재 AVCapturePhotoOutput에서 고품질 사진을 얻으려면 사진을 캡처할 때 설정의 열거형 값에서 quality 값을 선택해야 합니다 balanced와 quality 값에서는 일반적으로 멀티프레임 퓨전과 노이즈 제거가 포함돼 있죠 iPhone 11 Pro와 이후 모델에서는 'Deep Fusion'이라는 첨단 기술이 탑재됐습니다 해상도가 높고 디테일이 선명한 사진을 제공하죠 이 Deep Fusion 사진을 보면 앵무새의 깃털이 선명하고 뚜렷하게 보입니다 그러나 여기엔 비용이 따르죠 다음 캡처 요청이 오기 전까지 처리가 완료돼야 하지만 완료까지 시간이 걸리니까요 실제 사례를 살펴보죠 카메라 소프트웨어 팀이 사무실로 출근하는 방법을 프레젠테이션으로 만들려고 합니다 데빈이 첨단 자전거 기술로 Apple Park를 돌아다니고 있군요 제가 셔터 버튼을 탭하면 다음 촬영이 가능해질 때까지 셔터 버튼이 돌아갑니다 훌륭한 Deep Fusion 사진이 결과물로 나왔습니다 수염의 디테일 좀 보세요 하지만 제가 탭을 할 때 처리가 동시에 진행되기 때문에 촬영과 촬영 사이 간격이 느리게 느껴집니다 따라서 디테일이 선명한 사진을 얻었을지는 몰라도 제가 원한 순간을 담지 못했을 수도 있죠 이벤트의 구성도를 살펴보겠습니다 AVCapturePhotoOutput에 설정된 capturePhoto 메서드를 호출합니다 처리 중 다양한 지점에서 대리자에 콜백이 오죠 willBeginCaptureFor resolveSettings처럼요 카메라 소프트웨어 스택이 센서에서 프레임을 가져오면 저희의 처리 기술을 활용하여 Deep Fusion 이미지로 융합합니다 그리고 그 사진을 다시 보내면서 didFinishProcessingPhoto 대리자 콜백을 이용하죠 이 처리는 다음 캡처가 실행되기 전에 완료돼야 하며 시간이 걸릴 수 있습니다 여러분은 capturePhoto를 didFinishProcessingPhoto 콜백보다 먼저 호출할 수도 있지만 호출이 시작되려면 이전 사진의 처리가 끝나야 합니다 지연 사진 처리를 활용하면 이 타임라인이 짧아집니다 사진을 요청했을 때 그 요청이 적절하다면 카메라 파이프라인에서 미완성 프록시 사진을 전달합니다 didFinishCapturingDeferred PhotoProxy 대리자 콜백으로요 이 프록시 사진은 플레이스홀더로 라이브러리에 저장되죠 그러면 다음 사진을 즉시 캡처할 수 있습니다 카메라 세션이 종료되면 나중에 시스템에서 처리를 마치고 최종 사진을 완성합니다 이제 앱 설정에서 지연 사진 처리를 켜면 캡처 세션의 설정이 변경되어 캡처 시점에 프록시 사진을 보내게 됩니다 이전처럼 선명한 고화질 사진을 얻을 수도 있지만 대신 최종 처리를 미루면 지금 이 순간에 더 많은 사진을 찍을 수 있죠 훌륭한 앞바퀴 들기네요 자전거가 튼튼하군요 됐습니다, 프레젠테이션에 써도 되겠어요, 수염도 멋지고요 이번에는 지연 처리 사진을 얻기까지 일어나는 상호작용을 살펴보겠습니다 이전 WWDC 프레젠테이션을 잠깐 복습해 보죠 AVCaptureSession을 구성해서 사진을 캡처할 때는 AVCaptureDeviceInput과 함께 AVCaptureDevice를 추가합니다 카메라를 세션으로 연결하는 거죠 그다음에는 AVCapturePhotoOutput을 세션에 추가합니다 그리고 특정 포맷이나 세션 프리셋을 선택합니다 보통은 Photo 세션 프리셋이죠 앱이 photoOutput에서 capturePhoto를 호출합니다 그 사진이 지연 사진 처리에 적합한 유형이라면 didFinishCapturingDeferred PhotoProxy로 다시 호출합니다 그곳에서 프록시 데이터를 포토 라이브러리로 보내죠 현재 포토 라이브러리에 프록시 사진이 들어왔지만 최종적으로 필요한 건 처리를 마친 이미지입니다 포토 라이브러리에서 이미지 데이터를 요청하면 즉시 최종 사진 처리가 이뤄집니다 또는 기기를 사용하지 않을 때처럼 시스템에 여유가 있을 때 백그라운드에서 처리를 마치죠 이제 제 동료 서배스천이 코딩 방법을 알려 드릴 겁니다 부탁할게요, 서배스천 고마워요, 롭 전 서배스천 머디나고 Photos 팀 엔지니어입니다 오늘은 최근에 캡처한 이미지를 사용해서 Photokit을 이용한 지연 처리를 살펴보겠습니다 그리고 PHImageManager 요청으로 같은 이미지를 받으면 무엇이 달라지는지 살펴보겠습니다 하지만 Photokit으로 에셋을 처리하기에 앞서 지연 처리에 사용할 카메라 API부터 준비해야 합니다 그래야만 앱이 지연 사진 프록시 이미지를 받아서 Photokit으로 전송할 수 있죠 이 기능을 사용할 수 있는 코드를 써 보겠습니다 AVCapturePhotoOutput과 AVCaptureSession 객체를 준비했죠 이제 우리 세션을 설정해 보겠습니다 이 경우에는 세션에 사진 유형의 프리셋이 있어야만 지연 처리의 장점을 이용할 수 있습니다 이제 캡처 기기를 가져와서 기기 입력을 설정하겠습니다 그리고 가능하다면 기기 입력도 추가해 보죠 다음으로 photoOutput을 추가할 수 있는지 확인하겠습니다 가능하다면 추가하세요 다음은 새로운 기능입니다 새로운 AutoDeferredPhoto DeliverySupported 값이 true여야만 캡처된 사진을 지연 처리로 보낼 수 있습니다 이것이 통과하면 새로운 지연 사진 전달을 선택할 수 있습니다 여기에 사용되는 프로퍼티는 autoDeferredPhoto DeliveryEnabled입니다 지연 사진 전달을 선택하고 활성화하기만 하면 카메라 코드에 지연 사진 처리를 추가할 수 있습니다 마지막으로 세션 구성을 살펴보겠습니다 이제 capturePhoto 메서드에 호출이 발생하면 수신한 대리자 콜백이 지연 프록시 객체를 보관합니다 이러한 콜백의 예시를 들어 보겠습니다 이 사진 캡처 콜백은 카메라로부터 AVCapturePhotoOutput과 AVCaptureDeferredPhotoProxy 객체를 받습니다 제가 최근에 캡처한 이미지와 관련된 객체죠 우선 우리가 받은 출력값이 적절한 값인지 확인해야 합니다 error 매개변수의 값을 확인해 보죠 이제 Photokit을 이용해서 포토 라이브러리에 이미지를 저장해 보겠습니다 공유 PHPhotoLibrary에서 변경을 수행하겠습니다 필요한 건 포토 라이브러리에 대한 접근 권한뿐입니다 이제 AVCaptureDeferredPhotoProxy 객체의 사진 데이터를 캡처합니다
포토 라이브러리에서 변경을 수행하기 때문에 관련된 performChanges 인스턴스 메서드를 설정합니다 다른 에셋 저장과 마찬가지로 PHAssetCreationRequest를 씁니다 그리고 요청이 오면 addResource 메서드를 호출하죠 매개변수는 PHAssetResourceType .photoProxy를 사용합니다 이미지의 지연 처리를 시작하라고 PhotoKit에 지시를 보내죠 이전에 캡처한 프록시 이미지 데이터도 추가합니다 이 경우에는 어떤 옵션도 주지 않습니다 여기서 주의해야 할 것은 지연 처리가 필요 없는 이미지에 이 리소스 유형을 사용하면 오류가 발생한다는 점입니다 오류 이야기가 나온 김에 완료 핸들러 내에서 확인해 보겠습니다 방법은 간단합니다 응용 프로그램이 적절하다고 판단할 때 완료 핸들러 내에서 성공 및 오류를 처리하세요 이번에는 에셋을 돌려받고 싶다고 가정해 보죠 PHImageManager 요청을 이용하면 됩니다 그 코드도 살펴보죠 매개변수의 경우 방금 Photokit으로 보낸 이미지의 PHAsset 객체가 있습니다 반환할 이미지의 크기와 콘텐츠 모드가 담겨 있죠 기본 PHImageManager 객체를 받고 requestImageForAsset 메서드는 imageManager 객체를 사용해서 이미지 에셋을 호출합니다 매개변수로는 이전에 가져온 에셋과 타깃 크기, 콘텐츠 모드가 들어갑니다 그리고 여기서는 어떤 옵션도 쓰지 않겠습니다 이제 resultHandler로 콜백을 처리할 수 있습니다 resultImage는 UIImage고 info는 이미지와 관련된 딕셔너리죠 현재 첫 번째 콜백은 저해상도 이미지와 정보 딕셔너리 키인 PHImageResultIs DegradedKey를 포함하지만 최종 이미지 콜백에선 사라집니다 이것을 확인해 보죠 Photokit을 이용한 처리 이미지 생성을 추가하면 새로운 API를 사용할 수 있습니다 requestImageForAsset 메서드에서 2차 이미지를 받을 수 있죠 이미지의 지연 처리 완료까지 시간이 걸릴 수 있으므로 그동안에는 2차 이미지를 표시합니다 새 이미지를 받으려면 PHImageRequestOptions에서 allowSecondaryDegradedImage를 사용하세요 새 이미지는 requestImageForAsset 메서드의 현재 두 콜백 사이에 배치됩니다 이미지와 관련된 정보 딕셔너리에는 PHImageResultIsDegradedKey의 엔트리가 포함됩니다 이것은 현재 1차 이미지 콜백에 사용되고 있죠 예시를 보며 알아보겠습니다 requestImageForAsset 메서드는 현재 두 이미지를 제공합니다 첫 번째는 완성된 고품질 이미지를 준비하는 동안 임시로 표시할 저화질 이미지입니다 새 옵션을 사용하면 최종 이미지를 처리하는 사이 두 이미지의 중간 지점에서 해상도가 더 높은 이미지를 제공할 수 있습니다 최종 이미지를 기다리는 동안 새 이미지를 보여 주면 사용자의 시각적 경험을 개선할 수 있죠 이 방법을 사용하는 코드를 작성해 보겠습니다 이번에는 PHImageRequest Options 객체를 생성합니다 그다음에는 allowSecondaryDegradedImage 옵션을 true로 설정합니다 그래야 2차 이미지 콜백을 다시 보내야 한다고 알릴 수 있죠 이전에 작성한 requestImageForAsset 메서드를 다시 쓸 수 있습니다 이번에는 방금 쓴 이미지 요청 옵션 객체를 추가해 보죠 새로운 2차 이미지 정보 딕셔너리가 PHImageResultIsDegradedKey에서 true 값을 가지므로 첫 번째 콜백과 마찬가지로 확인해 보겠습니다 이제 새로운 2차 이미지를 받을 수 있습니다 여러분의 앱을 잘 지원하려면 결과 핸들러 내에서 이미지를 처리하세요 지연 처리를 통해 포토 라이브러리에 이미지를 추가하는 방법과 최종 이미지가 처리 중에 있을 때 앱에 표시할 이미지 요청에서 고품질 2차 이미지를 얻는 방법을 살펴봤습니다 이러한 변경 사항은 iOS 17 tvOS 17, macOS Sonoma부터 새 지연 처리 PhotoKit과 함께 제공됩니다 그럼 다시 롭에게 넘겨서 응답성이 뛰어난 카메라를 위한 새 도구를 알아보겠습니다 굉장하네요 고마워요, 서배스천 이제 지연 사진 처리에서 멋진 경험을 제공하기 위한 세부 사항을 살펴보겠습니다 포토 라이브러리부터 시작해 보죠 지연 사진 처리를 이용하려면 프록시 사진을 저장할 포토 라이브러리에 쓰기 권한이 필요하고 앱에서 최종 사진을 표시하거나 수정할 경우에는 읽기 권한이 필요합니다 하지만 명심하세요 라이브러리에 대한 접근 요청은 필요한 만큼 최소한으로 줄여야만 고객의 개인정보 보호와 신뢰를 유지할 수 있습니다 따라서 저희가 추천하는 것은 프록시 사진을 받은 후 해당 fileDataRepresentation을 신속히 라이브러리로 가져오세요 앱이 백그라운드에 있으면 일정 시간 실행 후 시스템이 앱을 일시 중단합니다 메모리 사용량이 너무 커지면 시스템이 자동으로 해당 백그라운드 창에서 앱을 강제로 종료할 수도 있죠 프록시를 라이브러리로 가능한 한 빨리 가져와야 고객의 데이터가 손실될 가능성을 줄일 수 있습니다 다음으로 필터를 적용하는 것처럼 사진의 픽셀 버퍼를 변경하거나 AVCapturePhoto File Data Representation Customizer로 AVCapturePhoto의 메타데이터나 프로퍼티를 변경하는 경우 처리가 완료된 후에는 라이브러리의 최종 사진에 아무 영향도 주지 않습니다 나중에 PhotoKit API로 사진을 조정할 때 이 작업을 수행하세요 또한 여러분의 코드는 지연된 프록시 사진과 지연 처리가 안 된 사진을 같은 세션에서 처리해야 합니다 모든 사진을 추가 단계로 처리하는 것은 불필요하기 때문입니다 예를 들어 사진 품질을 우선하는 열거형 값으로 촬영한 플래시 캡처의 처리는 Deep Fusion 사진과 달리 촬영과 촬영 사이의 시간을 줄일 수 없습니다 그리고 AVCapturePhotoSettings엔 옵트인과 옵트아웃 프로퍼티가 없다는 걸 알아차리셨을 겁니다 지연 사진 처리는 자동으로 이뤄지기 때문입니다 옵트인했을 때 카메라 파이프라인이 처리 시간이 긴 사진을 찍으면 프록시를 보낼 것입니다 부적합한 경우에는 최종 사진을 보내죠 따라서 옵트인과 옵트아웃이 촬영마다 필요하진 않습니다 캡처 세션에 들어가기 전 AVCapturePhotoOutput에서 isAutoDeferredPhotoProcessing Enabled를 true로 설정하세요 마지막으로 볼 것은 사용자 경험입니다 지연 사진 처리는 빠른 연속 촬영에서 훌륭한 이미지 품질을 제공합니다 완료 시점까지 최종 처리를 미룰 뿐이죠 여러분의 앱이 즉시 이미지를 표시하는 기능으로 공유와 편집을 가능하게 한다면 사용자는 뛰어난 사진 품질에 크게 관심을 두지 않을 겁니다 지연 사진 처리를 쓰지 않는 편이 낫죠 이 기능은 iPhone 11 Pro와 11 Pro Max 및 최신 iPhone부터 사용할 수 있습니다 AVCapturePhotoOutput 작업 방법과 라이브러리 권한 관리는 아래 세션에서 살펴보세요 이제 제로 셔터 랙으로 넘어가서 스케이트보드 이야기를 해 보죠 카메라 소프트웨어 팀의 탈것 프레젠테이션을 만들려고 스케이트 공원으로 동영상을 찍으러 갔습니다 제 iPhone 14 Pro의 액션 모드로 동료를 촬영 중이죠 제 슬라이드에 넣을 고품질 히어로 액션 숏도 찍고 싶습니다 그런데 미리 얘기하자면 전 스케이트보드 안 탑니다 토모가 뛰어오르는 장면을 담으려고 셔터 버튼을 탭했죠 사진을 확인하려고 카메라 롤에 들어가자 이 사진이 나왔습니다 가장 높이 뛰었을 때 셔터 버튼을 탭했는데 사진이 찍힌 건 땅에 내려온 후였죠 제가 찍고 싶었던 장면이 아닙니다 어떻게 된 걸까요? 셔터 랙입니다 셔터 랙 때문이죠 '셔터 랙'은 지연 현상입니다 캡처를 요청하면 센서에서 하나 이상의 프레임을 판독해서 하나의 사진으로 융합해 표시할 때까지 걸리는 시간이죠 시간은 왼쪽에서 오른쪽으로 흐릅니다 왼쪽은 오래된 프레임이고 오른쪽은 새로운 프레임이죠 카메라 뷰파인더에 보이는 건 5번 프레임입니다 지금은 AVCapturePhotoOutput에서 capturePhoto:with settings를 호출하면 카메라 파이프라인이 센서에서 프레임을 캡처하고 처리 기술을 적용하기 시작합니다 그러나 캡처된 프레임의 브래킷은 탭 이후 5번 프레임부터 시작되고 여러분이 얻는 사진은 6번 이후의 프레임이죠 초당 30프레임에서 각 프레임은 뷰파인더에 33ms 동안 표시됩니다 말로 들으면 그렇게 짧은지 모르지만 동작이 끝나는 건 순식간입니다 그 시간이면 토모는 땅에 내려오고 저는 히어로 숏을 놓치죠 제로 셔터 랙 기능이 활성화되면 카메라 파이프라인은 이전 프레임의 롤링 링 버퍼를 유지합니다 지금 5번 프레임이 뷰파인더에 표시되고 있다면 캡처 버튼을 탭하는 순간 카메라 파이프라인이 약간 과거로 거슬러 가서 링 버퍼의 프레임을 가져온 후 그것도 함께 융합합니다 그러면 원하는 사진이 나오죠 이제 앱 설정 창에서 두 번째 토글을 켜고 제로 셔터 랙을 활성화해 보겠습니다 토모가 뛰어오른 순간 셔터 버튼을 탭하자 제가 프레젠테이션에 쓰고 싶었던 히어로 숏이 찍혔습니다 앱에 제로 셔터 랙을 적용하려면 뭘 해야 하는지 알아봅시다 아무것도 필요 없습니다 iOS 17 이후 작동하는 앱에서 제로 셔터 랙을 활성화했습니다 AVCaptureSessionPresets와 AVCaptureDeviceFormats에서 isHighestPhotoQuality Supported를 true로 설정했죠 그러나 테스트 중에 원하지 않은 결과가 나온다면 AVCapturePhotoOutput.isZero ShutterLagEnabled를 끄세요 그리고 설정된 프리셋과 포맷에서 photoOutput이 제로 셔터 랙을 지원하는지 확인하려면 출력이 세션에 연결됐을때 isZeroShutterLagSupported가 true인지 확인하세요 스틸 이미지 중에서 플래시 캡처와 수동 노출 AVCaptureDevice 구성 브래킷 캡처 및 여러 카메라의 프레임을 동기화하는 사진 요소 전달의 경우 제로 셔터 랙을 사용하면 안 됩니다 카메라 파이프라인이 시간을 거슬러 올라가서 링 버퍼의 프레임을 가져오므로 캡처를 시작하는 제스처와 캡처를 시작해서 photoSettings에 사진을 보내는 사이에 긴 지연 시간이 발생하면서 카메라가 흔들릴 수 있습니다 따라서 탭을 한 순간부터 capturePhoto API를 호출할 때까지 가능한 한 작업을 줄여야 합니다 응답성이 뛰어난 카메라 경험을 만드는 기능은 여기까지 설명하고 응답형 캡처 API를 살펴보겠습니다 이 API 그룹을 사용하면 여러분의 고객이 중복되는 캡처를 수행하고 사진 품질을 조정해 연속 촬영 사이 속도를 높이고 다음 촬영이 준비되면 훌륭한 UI 피드백을 줄 수 있습니다 우선 주요 API인 응답형 캡처입니다 다시 스케이트 공원에서 이전에 살펴본 두 기능을 켜면 1초에 사진 두 장을 캡처할 수 있습니다 확실히 볼 수 있게 영상을 느리게 재생해 보죠 초당 2프레임에서는 토모가 공중에 떴을 때 다양한 동작을 볼 수 없습니다 그나마 건진 게 이 사진입니다 나쁘진 않지만 더 멋진 사진을 찍고 싶네요 이제 세 번째와 네 번째 응답형 캡처 기능을 활성화합니다 빠른 캡처 우선 처리는 잠시 후에 살펴보죠 우선 공원으로 돌아갑시다 처음부터 다시 찍어 보죠 응답형 캡처를 사용하면 같은 시간에 더 많은 사진을 찍을 수 있고 좋은 사진이 담길 확률도 오릅니다 프레젠테이션 처음에 사용한 히어로 숏입니다 다들 정말 좋아하겠네요 AVCapturePhotoOutput .capturePhoto에 대한 호출을 설정 메서드의 세 단계로 생각해 봅시다 센서에서 프레임을 캡처하고 캡처한 프레임을 압축되지 않은 최종 이미지로 처리한 후 HEIC 또는 JPEG로 사진을 인코딩합니다 인코딩이 완료되면 photoOutput에서 대리자의 didFinishProcessingPhoto 콜백을 호출합니다 지연 사진 처리 API를 옵트인했고 그 촬영이 적합하다면 didFinishCapturingDeferred PhotoProxy를 호출할 것입니다 그러나 캡처 단계가 완료되고 처리 단계가 시작되면 이론상 photoOutput은 다음 캡처를 시작할 수 있죠 이제 그 이론이 실현되어 앱에서 사용할 수 있습니다 주요 응답형 캡처 API를 선택하면 photoOutput에서 이 단계를 겹쳐 실행하기 때문에 다른 요청이 처리 중에 있을 때도 새 사진 캡처 요청을 시작해서 고객에게 더욱 빠르고 일관적인 연속 촬영 사진을 제공합니다 이렇게 하면 사진 촬영에 사용되는 최대 메모리가 증가합니다 앱이 많은 메모리를 사용하면 시스템에 부담을 주므로 옵트아웃을 하고 싶거나 해야 하는 경우가 생기죠 타임라인으로 돌아가 보죠 빠르게 두 장을 연속해서 찍습니다 willBeginCaptureFor resolvedSettings와 사진 A에 대한 didFinishCapture ForresolvedSettings에 대리자가 콜백을 받죠 그러나 사진 A에 대한 didFinishProcessingPhoto 대신 즉, 사진이 인코딩되어 여러분에게 전달되는 대신 사진 B의 willBeginCaptureFor resolvedSettings를 얻습니다 현재 사진 두 장이 처리 중에 있으므로 여러분의 코드가 인터리브된 사진의 콜백을 제대로 처리하는지 확인해야 합니다 겹칠 수 있는 응답형 캡처를 사용하려면 제로 셔터 랙이 지원되는 경우 활성화하세요 응답형 캡처를 지원받으려면 이 기능을 켜야 합니다 그리고 AVCapturePhotoOutput isResponsiveCaptureSupported API로 photoOutput이 프리셋과 포맷을 지원하는지 확인하세요 그리고 AVCapturePhotoOutput에서 .isResponsiveCaptureEnabled를 true로 놓으세요 조금 전 빠른 캡처 우선 처리를 활성화했는데요 지금부터 간단하게 살펴보겠습니다 photoOutput에서 이 기능을 켜면 짧은 시간 안에 여러 장의 캡처가 찍히는 것을 감지하고 그에 반응해서 사진 품질을 최고 품질에서 '균형' 쪽으로 조정하여 촬영 사이 간격을 유지합니다 사진 품질에 영향을 끼치므로 기본적으로 꺼져 있습니다 카메라 앱 설정 창에서는 '빠른 촬영 우선'으로 표시됩니다 저희는 카메라 앱 기본 설정에서 이 기능을 켰습니다 촬영 사이의 일관된 간격이 더 중요하다고 생각했기 때문이죠 하지만 앱과 고객에 따라 설정을 바꿀 수 있습니다 예상하셨겠지만 photoOutput에서 isFastCapturePrioritization Supported 프로퍼티를 확인하면 지원 여부를 확인할 수 있습니다 그리고 지원하는 경우 isFastCapturePrioritization Enabled를 true로 설정하면 여러분이나 고객이 기능을 사용할 수 있죠 이제 버튼의 상태와 모양 관리를 살펴보겠습니다 다음 캡처를 시작할 준비가 됐거나 처리 중이라면 photoOutput에서 표시할 수 있습니다 상황에 맞게 사진 캡처 버튼을 업데이트하세요 AVCapturePhotoOutput .CaptureReadiness라는 값으로 수행됩니다 photoOutput은 notRunning, ready 및 세 가지 notReady 상태를 갖습니다 Momentarily, WaitingForCapture WaitingForProcessing입니다 notReady 열거형 값은 capturePhoto를 호출할 때 캡처와 사진 전송 사이에 더 긴 대기 시간이 발생하며 앞에서 다룬 셔터 랙이 증가한다는 것을 의미합니다 앱은 새로운 클래스를 사용해서 상태 변화를 감지합니다 AVCapturePhotoOutput ReadinessCoordinator죠 이것은 PhotoOutput의 준비 상태가 변경될 때 대리자 객체에 대한 콜백을 생성합니다 빠른 캡처 우선 처리 API와 응답형 캡처를 이용하지 않아도 이 클래스를 사용할 수 있습니다 셔터의 촬영 가능 상태를 보여 주거나 버튼 모양을 수정하려면 Readiness Coordinator와 Readiness 열거형 값을 사용하세요 세션에서 예시로 든 앱은 NotReady 열거형 값을 처리할 때 캡처 버튼에서 사용자 상호작용을 끔으로써 실수로 인한 여러 번의 촬영이 대기열에 추가되어 긴 셔터 랙이 발생하는 것을 막습니다 셔터 버튼을 탭하면 설정 요청과 capturePhoto가 대기열에 추가됩니다 captureReadiness 상태는 .ready와 .notReadyMomentarily 사이에 있죠 플래시 캡처는 .notReadyWaiting ForCapture 상태에 도달합니다 플래시가 터질 때까지 photoOutput은 센서에서 프레임을 받지 못하므로 버튼은 흐리게 표시되죠 마지막으로, 올해 새 기능 중 제로 셔터 랙만 사용한다면 .notReadyWaitingForProcessing 열거형 값이 준비 상태일 때 스피너를 표시할 수 있습니다 사진의 캡처와 처리가 완료될 때까지요 코드에서 Readiness Coordinator는 다음과 같이 사용합니다 우선 photoOutput에 대한 Readiness Coordinator를 생성한 후 준비 상태에 대한 콜백을 수신할 적절한 대리자 객체를 생성합니다 그리고 각각의 캡처 시점에서 평소처럼 사진 설정을 설정합니다 그다음 Readiness Coordinator에 해당 캡처 요청 준비 상태를 추적하라고 지시합니다 그리고 photoOutput에 capturePhoto를 호출합니다 그러면 Readiness Coordinator가 captureReadinessDidChange 대리자 콜백을 호출합니다 수신된 준비 상태 열거형 값에 따라서 캡처 버튼의 상태와 모양을 업데이트하여 언제 다시 캡처할 수 있는지 고객에게 알기 쉽게 전달합니다 응답형 캡처와 빠른 캡처 우선 처리 API는 A12 Bionic 이후 칩이 탑재된 iPhone에서 사용할 수 있으며 Readiness Coordinator는 AVCapturePhotoOutput을 지원하는 모든 기기에서 쓸 수 있습니다 저희 앱에 탑재한 새 기능을 모두 살펴봤습니다 카메라는 빠른 응답성과 함께 아주 선명한 고품질 사진을 제공합니다 하지만 모든 기능을 전부 쓸 필요는 없습니다 여러분의 앱에 적합한 기능만 사용하세요 오늘 세션의 마지막은 추가된 비디오 효과입니다 기존 macOS의 Control Center는 카메라 스트리밍 기능을 지원했습니다 센터 스테이지, 인물 사진 모드 스튜디오 조명이죠 macOS Sonoma에서는 비디오 효과를 Control Center에서 빼서 독립 메뉴로 만들었습니다 따라서 카메라 또는 화면 공유의 미리보기를 띄우거나 인물 사진 모드, 스튜디오 조명 등 비디오 효과를 켤 수 있죠 인물 사진 모드와 스튜디오 조명은 강도를 조절할 수 있습니다 스튜디오 조명도 더 많은 기기에서 쓸 수 있죠 새로운 효과 유형은 '리액션'입니다 여러분은 비디오 통화 중에 말하는 사람을 방해하지 않고 아이디어가 좋다고 표현하거나 엄지를 세우고 싶을 때가 있을 겁니다 리액션은 풍선이나 색종이를 비디오와 매끄럽게 혼합합니다 리액션은 인물 사진 모드와 스튜디오 조명 템플릿을 따릅니다 시스템 단계의 카메라 기능이기 때문에 즉시 사용할 수 있으며 여러분의 앱에서 코드를 수정할 필요가 없습니다 인물 사진 모드와 스튜디오 조명의 자세한 내용은 2021년 '카메라 캡처의 새 기능'을 참고하세요 영상 스트림에서 리액션을 보여 주는 방법은 세 가지입니다 첫째, macOS의 새로운 비디오 효과 메뉴에서 리액션 효과를 클릭하세요 둘째, AVCaptureDevice .performEffect for: a reaction type을 여러분의 앱에 호출하세요 예를 들어 앱 뷰에 리액션 버튼 모음을 넣어서 참가자가 클릭하면 리액션이 일어나게 할 수 있습니다 셋째, 리액션이 활성화되면 제스처를 취해서 보낼 수 있습니다 직접 보시죠 엄지손가락을 세울 수 있습니다 엄지를 내리거나 불꽃놀이 배경에서 양손 엄지를 세울 수도 있죠 하트 보내기 한 손 브이 사인과 함께 풍선 날리기 빗속 배경에서 양손 엄지 내리기 양손 브이 사인과 함께 색종이 흩날리기 그리고 제가 좋아하는 레이저 배경에서 양손 뿔 사인도 가능합니다 근사한 효과가 많네요 어떤 리액션 효과를 지원하는지 알아보려면 캡처 세션에서 사용하는 AVCaptureDeviceFormat의 reactionEffectsSupported 프로퍼티를 확인하세요 AVCaptureDevice의 프로퍼티를 확인하면 키 값을 읽거나 관찰해서 제스처 인식이 언제 켜졌고 언제 리액션 효과가 활성화됐는지 알 수 있습니다 명심하세요, 이 기능의 권한은 사용자에게 있기 때문에 여러분의 앱에서 켜거나 끌 수 없습니다 iOS에서도 개념은 같습니다 참가자가 Control Center에서 제스처 인식을 켜거나 끄면 그때 여러분은 키 값을 확인할 수 있죠 그러나 iOS의 앱에 효과를 적용하려면 프로그래밍이 필요합니다 지금부터 그 방법을 살펴보죠 canPerformReactionEffects 프로퍼티가 true라면 performEffect for: reactionType 메서드를 호출할 때 비디오 피드에 리액션이 렌더링됩니다 여러분의 앱은 효과를 적용할 버튼이 필요합니다 제스처로 들어오는 리액션은 performEffect를 호출할 때와 다른 위치에서 비디오에 렌더링될 수 있습니다 탐지에 사용된 신호에 따라 달라지죠 새 열거형 값인 AVCaptureReactionType은 모든 리액션 효과에 대응합니다 예를 들어 엄지 세우기와 풍선을 AVCaptureDevice가 캡처 세션에서 인식하고 비디오 콘텐츠에 렌더링하죠 그리고 AVCaptureDevice .availableReactionTypes 프로퍼티는 설정된 포맷과 세션 프리셋에 따라 AVCaptureReactionTypes를 반환합니다 이러한 효과들은 여러분의 뷰에 배치할 수 있는 시스템 내장 UIImage도 가지고 있습니다 리액션에 대한 systemName은 새 함수에서 구할 수 있습니다 AVCaptureReactionType .systemImageName이 AVCaptureReactionType을 받아서 UIImage systemName 생성자와 함께 적절한 문자열을 반환하죠 리액션 효과가 진행될 때 알려 주는 API도 있습니다 이름도 적절한 AVCaptureDevice .reactionEffectsInProgress죠 사용자가 한 시퀀스에서 다수의 리액션 효과를 실행하면 조금씩 겹칠 수 있으므로 상태 객체의 배열을 반환합니다 키 값을 관찰하면 시작점과 끝점을 알 수 있죠 VoIP 회의 앱의 경우에는 이 정보를 활용하여 효과의 메타데이터를 원격 뷰로 보낼 수 있습니다 특히 발신자가 대역폭 문제로 영상을 껐을 때 유용하죠 예를 들어 다른 발신자를 대신해서 UI에 효과 아이콘을 표시할 수 있습니다 비디오 스트림에 효과 애니메이션을 렌더링하는 건 비디오 인코더에 부담을 줍니다 콘텐츠가 복잡해지면서 인코딩에 필요한 비트레이트가 늘어나죠 reactionEffectsInProgress를 관찰하는 키 값을 쓰면 렌더링이 진행되는 동안 인코더를 조정할 수 있습니다 여러분의 앱에 필요하다면 효과가 렌더링되는 동안 비트레이트를 올릴 수 있습니다 또는 VideoToolbox를 활용한 저지연 비디오 인코더를 사용하고 VTCompressionPropertyKey에서 MaxAllowedFrameQP를 설정했다면 앱에서 다양한 비디오 구성으로 테스트를 수행해 보세요 해상도와 프레임률 및 비트레이트 단계 지원을 살펴보고 효과가 진행되는 동안 최대 허용 FrameQP를 조정할 수 있습니다 MaxAllowedFrameQP 값이 낮으면 효과의 프레임률이 떨어지면서 비디오 프레임률도 떨어진다는 걸 명심하세요 2021년 'VideoToolbox를 활용한 저지연비디오 인코딩살펴보기'에서 이 기능을 더욱 자세하게 알아보실 수 있습니다 그리고 명심하셔야 할 것은 효과가 진행 중일 때 프레임률이 변경될 수 있다는 점입니다 예를 들어 AVCaptureSession을 초당 60프레임으로 설정했다면 효과가 없을 때는 60프레임을 얻을 수 있습니다 그러나 효과가 진행 중일 때는 초당 30프레임으로 프레임률이 변경될 수 있죠 이것은 인물 사진 모드와 스튜디오 조명 모델을 따라갑니다 최종 프레임률이 지정한 것보다 떨어질 수 있죠 프레임률을 확인하려면 기기에 설정된 포맷에 대한 AVCaptureDeviceFormat.videoFrame RateRangeForReactionEffects InProgress를 확인하세요 다른 AVCaptureDeviceFormat 프로퍼티와 마찬가지로 이것은 앱에 정보를 제공할 뿐 여러분이 제어하는 것이 아닙니다 연속성 카메라를 사용하는 macOS 및 tvOS 앱에서 리액션 효과는 처음부터 활성화되어 있습니다 iOS 및 iPad OS의 앱은 Info.plist를 변경해 옵트인하세요 UIBackgroundModes 배열에 VoIP 응용 프로그램이란 것을 알리거나 NSCameraReactionEffectsEnabled를 Yes 값으로 추가하여 옵트인할 수 있습니다 리액션 효과와 제스처 인식은 A14 이후 칩을 사용하는 iPhone과 iPad에서 쓸 수 있습니다 iPhone 12처럼요 Apple 실리콘 기반 Mac과 Intel 기반 Mac 및 Apple TV 중 연속성 카메라 기능을 지원하는 기기와 USB-C iPad나 Apple 실리콘 기반 Mac에 연결된 Apple Studio Display 및 USB-C iPad나 Apple 실리콘 기반 Mac에 연결된 서드파티 카메라에서 쓸 수 있죠 이것으로 올해 새 API를 사용한 응답성이 뛰어난 카메라 경험 세션을 마칩니다 이번 세션에서는 지연 사진 처리와 제로 셔터 랙 응답형 캡처 API를 통해 여러분이 더욱 향상된 화질로 응답성이 뛰어난 사진 앱을 만드는 방법을 살펴봤습니다 그리고 사용자가 자신을 잘 표현할 수 있도록 새로 추가한 '리액션' 등 새 비디오 효과도 소개했죠 여러분이 새로운 기능에 어떻게 반응할지 기대되네요 감사합니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.