스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
tvOS에서 연속성 카메라 사용하기
AVFoundation, AVFAudio 및 AudioToolbox를 tvOS의 앱으로 가져와 거실용 카메라와 마이크 사용 환경을 만드는 법을 알아보세요. Device Discovery API를 써서 기존 iOS 카메라 환경에서 tvOS를 지원하는 법을 알아보고, iPhone을 웹캠이나 FaceTime 소스로 사용하는 앱을 빌드하며, tvOS에서 개발할 때 특별히 고려해야 할 점을 살펴보세요. 또한 tvOS에서 오디오 녹음을 활성화하는 방법과 뛰어난 음성 기반 환경을 만들기 위해 에코 캔슬링을 사용하는 방법을 살펴봅니다.
리소스
관련 비디오
WWDC23
WWDC22
-
다운로드
안녕하세요, 케빈 툴로드입니다 tvOS 팀의 소프트웨어 엔지니어죠 저는 소메시 가네시입니다 Core Audio 팀의 엔지니어죠
이번 세션에서는 tvOS 앱에 카메라와 마이크 지원 추가하기를 알아보겠습니다
tvOS 17은 연속성 카메라와 마이크를 Apple TV에 도입합니다 이제 iPhone과 iPad에서 카메라와 마이크 데이터를 스트리밍하여 tvOS 입력으로 쓸 수 있습니다 이로써 큰 화면에서 완전히 새로운 앱과 경험을 즐길 수 있게 됐죠 대부분의 tvOS 앱은 보통 두 가지 카테고리로 구분됩니다 영화와 TV 프로그램 스트리밍 같은 콘텐츠 재생 앱과 게임입니다
연속성 카메라로 완전히 새로운 tvOS 앱을 만들 수 있습니다 비디오와 오디오를 녹화하는 콘텐츠 제작 앱이나 화상 회의, 실시간 스트리밍을 하는 소셜 앱이 좋은 예죠
기존의 스트리밍 앱과 게임에 카메라와 마이크를 결합하여 이전 버전 tvOS에서는 불가능했던 완전히 새로운 기능을 만들 수 있습니다 이런 기능이 있어 다양한 TV용 앱을 쓸 수 있죠 이제 연속성 카메라와 마이크를 tvOS 앱에 추가하는 방법을 말씀드리겠습니다
작년에 macOS Ventura는 연속성 카메라를 도입했습니다 iPhone을 웹캠으로 쓸 수 있는 기능이죠 폰을 Mac에 그냥 가져가기만 하면 카메라와 마이크를 입력 기기로 쓸 수 있습니다 아직 macOS 연속성 카메라가 친숙하지 않으시다면 WWDC 2022에서 이 주제에 관한 세션을 보세요
이번 세션에서 제일 먼저 살펴볼 것은 tvOS 앱에서 카메라와 마이크에 액세스하는 API입니다 다음으로 알아볼 것은 tvOS 앱에서 연속성 카메라를 채택하여 iPhone이나 iPad를 카메라와 마이크로 쓰는 법입니다
tvOS에서 훌륭한 앱 경험을 어떻게 만드는지도 소개하죠 다른 플랫폼에서 개발할 때와 어떤 유사점과 차이점이 있는지를 중심으로요 마지막으로 소메시가 다양하고 복잡한 오디오 수요에 맞게 앱에서 쓸 수 있는 마이크 API를 소개합니다
먼저 캡처 기기 API를 살펴보겠습니다
AVFoundation, AVFAudio AudioToolbox를 쓰면 카메라와 마이크에 액세스하여 비디오와 오디오를 캡처할 수 있죠 먼저 앱에서 캡처 기기를 사용하는 방법을 복습하죠 특히 AVFoundation의 AVCapture 클래스 패밀리를 써서요
먼저 AVCaptureDevice와 AVCaptureDeviceInput을 씁니다 각각 카메라와 마이크에 대한 것입니다 이 두 개가 AVCaptureSession 즉, 캡처와 관련된 모든 걸 다루는 객체에 연결됩니다
AVCaptureOutputs는 다양하게 입력받은 데이터를 렌더링합니다 이것을 이용해 영화나 스냅 사진을 녹화하거나 카메라와 마이크 버퍼에 액세스할 수 있습니다 아니면 입력 기기로부터 다른 메타데이터를 받을 수도 있죠 UI에서 실시간 카메라 피드를 보여주려면 AVCaptureVideoPreviewLayer를 쓰면 됩니다 이는 CALayer를 서브클래스로 하는 특수한 유형의 출력입니다 데이터는 캡처 입력에서 호환 가능한 출력으로 흐릅니다 AVCaptureConnection을 통해서요 이런 캡처 API들은 iOS, macOS에서 사용 가능하며 이제 tvOS 17에서도 쓸 수 있습니다
AVFoundation의 캡처 기능을 활용한 개발이 처음이시라면 developer.apple.com의 Capture Setup 시작 페이지를 보세요 또한 tvOS는 iOS에서 제공되는 카메라와 마이크 API를 동일하게 지원합니다 iOS용으로 만든 카메라나 마이크 앱이 있다면 여러분의 코드는 대부분 tvOS에서도 작동할 겁니다 하지만 몇 가지 API 및 코딩 관행이 다릅니다
Apple TV에는 AV 입력이 내장되어 있지 않으므로 앱에서 Device Discovery를 채택하여 카메라와 마이크를 사용해야 합니다 이는 앱이 연속성 기기가 나타났다 사라지는 것과 같은 극단적인 예를 처리할 수 있도록 하기 위한 거죠
또한 tvOS에서 앱을 가져올 땐 iOS와 다른 미묘한 차이점이 있는데 최상의 tvOS 앱 경험을 위해 이런 사항도 살펴보겠습니다
iOS와 같은 카메라와 마이크 API를 tvOS에서 사용할 수 있으므로 기존 iOS 앱에 tvOS 지원을 추가하는 과정을 설명해 드리죠
iOS용으로 만든 간단한 카메라 및 마이크 앱이 있습니다 이 앱의 기본 UI는 카메라와 마이크에 액세스하여 사진을 캡처하거나 비디오와 오디오를 녹화합니다 이번 세션에서는 새 연속성 카메라 및 마이크 API로 이 앱에 tvOS 지원을 추가해 보겠습니다 어떻게 빌드하는지 보시죠
Xcode에서 ContentView를 열겠습니다 앱의 UI가 정의된 곳이죠 여기서 앱은 화면에 표시되는 기본 UI 요소의 위치를 지정합니다 가장 중요한 것은 CameraPreview 뷰로서 AVCaptureVideoPreviewLayer와 연결되어 다른 모든 UI 요소 뒤에서 실시간 카메라 미리보기를 표시하죠
다음은 CaptureSession 클래스입니다 AVFoundation의 여러 AVCaptureSession 클래스를 포함합니다 이 클래스에 있는 AVCaptureSession 프로퍼티는 어떤 캡처 입력을 선택하고 어디로 데이터를 출력할지 제어하는 데 사용됩니다 이 경우에는 출력 ContentView에 표시되는 AVCaptureVideoPreviewLayer입니다
CaptureSession 클래스에는 활성 비디오 입력을 설정하는 함수도 있죠 이 함수에서 앱은 선택한 입력의 유효성을 검사하고 AVCaptureSession을 구성한 다음 세션을 시작합니다 이렇게 하면 AVCaptureDevice에서 데이터의 흐름이 시작되어 ContentView에 표시되는 미리보기 레이어로 향하게 되죠
이 모든 AVCapture API는 이제 tvOS에서도 쓸 수 있으므로 앱이 지원하는 OS에 tvOS를 추가하겠습니다
이제 프로젝트 탐색기에서 프로젝트를 선택하고 앱의 타깃을 선택한 다음 Apple TV를 지원 대상으로 추가합니다
이 시점에서 앱은 tvOS에서 빌드 및 실행 가능합니다 하지만 사용 가능한 입력 기기가 없으므로 앱이 할 수 있는 게 많지 않습니다 이제 연속성 카메라를 보죠 먼저 tvOS에서 캡처 기기를 찾고 사용할 기기를 선택하는 절차를 보죠
AVCapture와 관련된 작업을 하기 전에 앱에 비디오 및 오디오 캡처 기기를 사용할 수 있는 권한이 있는지 확인해야 합니다 이렇게 하면 앱이 이러한 기기에 접근해야 하는 이유를 설명할 수 있으며 사용자는 접근을 수락하거나 거부할 수 있죠 반드시 Info.plist에서 카메라와 마이크 사용 키를 설정해야 합니다 이 설명은 권한 부여를 요청할 때 사용자에게 표시됩니다
사용자의 개인 기기에서 쓰는 앱을 만드는 데 익숙하실 겁니다 iPhone 또는 iPad와 같은 것들요 그런 기기엔 내장 카메라가 있죠 하지만 Apple TV는 공용 기기로서 여러 사람이 자기 iCloud 계정으로 공유하게 됩니다 공용 기기에서 최상의 경험을 제공하기 위해 방문자 계정을 포함하여 호환되는 기기를 가진 사람은 누구나 자신의 기기를 연속성 카메라로 쓸 수 있습니다
즉, 사용자는 앱의 녹화 기능을 집이나 친구의 집 또는 휴가용 임대 숙소와 같은 공유 공간에서도 쓸 수 있죠 카메라가 언제든지 시스템에 나타나거나 사라질 수 있으므로 앱이 이러한 경우를 처리할 수 있어야 합니다
AVKit은 새로운 뷰 컨트롤러인 AVContinuityDevicePickerView Controller를 제공합니다 이 컨트롤러를 써서 적합한 연속성 기기를 골라 카메라와 마이크로 사용할 수 있습니다 이 뷰 컨트롤러는 Apple TV에 로그인한 모든 사용자를 나열하고 각자의 기기를 연속성 카메라로 연결하게 해줍니다 방문 사용자가 Apple TV에 페어링하여 iOS 기기를 연속성 카메라로 사용하는 방법도 있습니다
캡처 기기에 액세스할 때 앱은 먼저 사용 가능한 기기가 있는지 확인해야 합니다 사용 가능한 기기가 있으면 캡처 기기 사용을 시작하여 캡처 세션을 시작하고 AVCaptureOutputs에 데이터를 보내죠 사용 가능한 기기가 없다면 기기 선택기를 이용하여 관련 UI를 사용자에게 보여줍니다 기기 선택기는 카메라와 마이크를 공유하는 과정 내내 안내하죠 기기가 선택되면 뷰 컨트롤러는 대리자 콜백을 호출하여 기기가 나타났다고 알려줍니다 그러면 사용자는 그 기기의 사용 가능성을 확인하고 이어서 캡처 세션을 시작합니다 백그라운드에서 tvOS와 iOS는 연결하기 위해 함께 작동합니다 선택이 되면 tvOS는 Apple TV 근처 사용자 기기의 통신 상태 확인 후 확인 메시지를 표시합니다 그러면 사용자는 알림 받은 기기의 연결을 수락할 수 있으며
이때부터 카메라와 마이크를 앱에서 사용할 수 있게 되고 카메라 및 마이크 데이터를 스트리밍할 수 있죠
SwiftUI 앱에 기기 선택기를 표시하기 위해 AVKit은 continuityDevicePicker라는 수정자를 제공합니다 이는 tvOS 17에 새로 추가된 것으로 기기 선택기를 표시합니다 표시 상태는 상태 변수에 의해 업데이트되며 이는 다른 콘텐츠 표시 뷰 수정자와 마찬가지입니다 기기가 선택되어 사용할 수 있게 되면 기기 선택기는 AVContinuityDevice로 콜백을 해제하고 호출합니다 이 객체가 참조하는 것은 AVCaptureDevice로 이것은 iPhone 또는 iPad 같은 지정된 물리적 기기와 연결돼 있습니다
기기 선택기 또한 UIKit 앱에 표시될 수 있습니다 AVContinuityDevicePicker ViewController를 써서요 이 뷰 컨트롤러가 받는 대리자는 선택적 수명 주기 이벤트와 함께 AVContinuityDevice가 선택되어 사용할 수 있게 될 때 콜백을 제공합니다 이러한 기기를 사용할 수 있게 되면 캡처 기기도 다른 기기 리스너에 게시됩니다 AVCaptureDeviceDiscoverySession 또는 AVCaptureDevice의 KVO 관찰자같은 것들요 기억해 두셔야 할 것은 tvOS에서 유일한 캡처 기기는 연속성 카메라라는 겁니다 즉, 여러분의 앱은 다음의 경우도 처리해야 합니다 카메라, 마이크가 사용 불가능에서 사용 가능으로 전환되거나 혹은 그 반대인 경우도요
모든 플랫폼에서 AVCaptureDevice .systemPreferredCamera는 가장 적합한 사용 가능 카메라를 액세스할 수 있게 합니다 이 API는 이제 tvOS에서 쓸 수 있고 정확히 동일한 방식으로 작동하죠
이 프로퍼티는 카메라 사용 가능 여부에 따라 업데이트됩니다 연속성 카메라는 한 번에 하나만 Apple TV에 연결할 수 있으므로 nil 값이면 사용 가능한 카메라가 없음을 의미하고 nil 값이 아니면 사용 가능한 연속성 카메라가 있음을 의미하죠 키-값 관찰을 사용하여 systemPreferredCamera의 변경 사항을 확인할 수 있습니다 tvOS에서 연결된 캡처 기기는 continuityCamera 유형입니다
systemPreferredCamera 프로퍼티를 키-값 관찰하면 앱은 카메라 사용 가능성에 따라 상태를 재평가할 수 있으며 카메라가 사용 가능하면 AVCaptureSession을 시작하여 비디오나 오디오 녹화를 시작합니다 카메라가 사용 가능하지 않으면 이전 캡처 세션에서 필요한 모든 teardown을 수행하고 사용자에게 기기를 더 이상 사용할 수 없음을 알리며 새 기기를 연결할 수 있는 선택지를 제공해야죠 연속성 카메라가 Apple TV에 연결되면 앱에서 기존의 카메라 캡처 API에 액세스할 수 있습니다 예를 들면 AVCaptureMetadataOutput을 써서 감지된 얼굴이나 신체 같은 프레임 단위 비디오 메타데이터를 가져올 수 있죠 AVCapturePhotoOutput을 써서 고해상도 사진을 캡처하고 AVCaptureMovieFileOutput으로 영화를 녹화하며 비디오 효과를 모니터링하거나 zoomFactor 같은 카메라 프로퍼티를 제어할 수 있고요 이제 훨씬 더 많은 카메라 API를 tvOS에서 연속성 카메라와 함께 사용할 수 있습니다 다음과 같은 이전 영상들을 참고하시면 고급 카메라 캡처 기능 및 기법을 자세히 알아보실 수 있죠 이런 tvOS 전용 API들을 앱에서 채택하여 연속성 캡처 기기를 검색하고 선택하는 겁니다 이런 기능을 현재 작업 중인 앱에 적용시켜 보겠습니다
Xcode의 ContentView에서 tvOS에 상태 변수가 필요하겠죠 기기 선택기의 표시 상태를 제어하기 위해서요
이제 상태 변수를 추가하고 컴파일러 가드를 사용하여 tvOS에서만 사용되게 합니다
ContentView 맨 아래에 tvOS 전용 확장 프로그램을 만들어 연속성 카메라 관련 로직을 처리합니다
그런 다음 계산된 변수를 추가하여 기기 선택기 표시 버튼을 만들죠 추가한 상태 변수를 토글해서요
다음으로 콜백 핸들러를 추가합니다 연속성 카메라가 연결될 때 호출되죠 연결되면 연속성 카메라를 활성 비디오 입력으로 설정하고 캡처 세션을 시작합니다
마지막으로 이미 연결된 경우 연속성 카메라를 활성화하는 메서드를 추가합니다
이제 UI에 추가해 보죠
뷰 본문에서 기기 선택기 버튼을 제 뷰에 추가하겠습니다
그런 다음 continuityDevicePicker 수정자를 추가하고 그것을 앞서 추가한 상태 변수와 콜백 함수에 연결합니다
마지막으로, 이미 연결돼 있다면 연결된 연속성 기기를 활성화하는 작업을 추가합니다
이제 기존 카메라 앱에 tvOS 지원을 추가하는 데 필요한 모든 코드 변경이 끝났습니다 Apple TV에서 앱을 실행하여 어떻게 보이는지 확인해 보죠
앱이 기본 UI로 실행되지만 아직 카메라를 연결하지 않아 카메라 피드는 없습니다 계속해서 기기 선택기를 불러오는 버튼을 선택해 보겠습니다
이렇게 하면 카메라 연결 옵션을 제공합니다 계속해서 저스틴의 사용자를 선택하고 페어링 안내에 따릅니다
연속성 카메라가 연결됐습니다! 이 앱의 tvOS 버전은 보시는 것과 같습니다 iOS와 동일한 코드를 공유하고 Device Discovery 추가를 위해 몇 가지만 사소하게 변경했으며 카메라 API의 기존 사용법은 변경되지 않았습니다 iOS 앱에서와 마찬가지로 사진을 찍을 수도 있습니다
이것이 바로 tvOS의 연속성 카메라입니다
기존 앱을 tvOS에 맞게 조정하거나 이제 막 tvOS 개발을 시작하는 경우라면 tvOS의 몇 가지 차이점을 요약해 드리겠습니다
tvOS에서 가장 눈에 띄는 차이점은 사용자 상호작용입니다 tvOS에는 직접적인 터치 이벤트가 없습니다 사용자는 상호작용할 때 포커스 엔진을 사용합니다 리모컨에서 스와이프하고 방향 화살표를 누르고 다른 버튼을 사용해서요
공용 기기로서 tvOS는 여러 사람이 사용할 수 있으며 여러 사용자와 방문 사용자를 지원합니다 따라서 앱이 개인 정보를 처리해야 할 수 있습니다 다른 플랫폼과는 다르게요 마지막으로 tvOS에는 고유한 파일 저장 정책이 있죠 이는 비디오나 오디오를 녹화하는 콘텐츠 제작 앱을 만들 때 특히 중요합니다 좀 더 자세히 살펴보죠
디스크 공간은 공유 리소스입니다 디스크 공간을 사용하는 것은 삭제될 수 없는 운영 체제와 설정이 켜져 있으면 삭제 가능한 프레임워크 및 앱 바이너리이며 저장 공간의 대부분은 임시 데이터의 캐시로 사용됩니다 tvOS 앱은 대부분 스트리밍 같은 콘텐츠 소비용으로서 사용 가능한 캐시 용량이 매우 커야 합니다 이런 디스크 공간 모델을 유지함으로써 모든 tvOS 앱에서 최고의 사용자 경험을 할 수 있죠
iOS에서는 FileManager를 사용하여 데이터를 영구적으로 저장하고 .documentDirectory 경로에 기록할 수 있습니다 이런 API의 사용은 tvOS에서 권장되지 않습니다
tvOS는 대용량 파일의 영구적 저장을 허용하지 않습니다 해더에서는 사용 가능하지만 .documentDirectory에서 사용하면 런타임 에러가 납니다 대신 tvOS용으로 빌드할 때 앱은 .cachesDirectory만 사용해야 합니다
이 디렉토리의 데이터는 앱 실행 중에는 사용할 수 있지만 이런 데이터는 앱이 실행되는 사이에 제거될 수 있습니다 그런 이유로 데이터를 최대한 빨리 다른 곳으로 옮기는 게 좋죠 클라우드에 업로드하고 지워서 디스크에 하나도 남지 않게 하는 식으로요 tvOS에서는 다른 파일 저장 옵션도 가능합니다 그에 관한 흥미로운 다중 사용자 사용 예가 몇 가지 있는데요 그중 하나는 CloudKit을 써서 iCloud에 앱 데이터를 저장하는 거죠 사용자별로도 가능합니다 예전에 tvOS의 다중 사용자 저장 옵션을 다룬 적이 있으니 해당 영상을 참고하시기 바랍니다 tvOS 앱 개발이 처음이라면 Planning your tvOS app 페이지를 보세요 developer.apple.com에 있습니다 Apple TV용으로 개발할 때 염두에 둬야 할 다양한 기능과 고려 사항을 다루고 있죠 이렇게 하면 훌륭한 tvOS 앱 경험을 만들 수 있습니다 tvOS 17의 새로운 연속성 카메라와 Device Discovery API를 써서요 이제 tvOS 17에서 액세스할 수 있는 다양한 마이크 기능을 살펴보죠 이제 앱은 tvOS에서 마이크를 사용할 수 있게 됐습니다 사상 처음이죠
이 기능을 사용하려면 여러분의 앱에 무엇을 해야 할지 살펴보겠습니다 올해 변경된 사항의 개요는 다음과 같습니다 tvOS의 AVFAudio 프레임워크의 Audio Session에 추가 사항이 있죠
iOS에서처럼 Audio Session은 시스템 레벨 인터페이스입니다 앱에서 오디오를 어떻게 사용할지 전달하는 곳이죠 예를 들어 중단, 경로 변경 같은 알림을 등록하고 처리하며 앱의 카테고리와 모드를 설정할 수 있습니다
전체 녹음 API 세트도 iOS에서 tvOS로 이전되었죠
여기에는 AVFAudio의 녹음 API들과 AudioToolbox 프레임워크도 포함됩니다 Audio Session부터 보겠습니다
tvOS 17으로 앱은 Apple TV에서 몇 가지 다른 마이크 기기를 사용할 수 있게 됩니다 iPhone이나 iPad 같은 연속성 마이크일 수도 있고 AirPods나 다른 헤드셋 같은 블루투스 기기일 수도 있죠 블루투스 기기는 tvOS 기기와 직접 페어링됩니다
입력 기기의 유형 파악은 AVAudioSessionPort 유형을 통해서 합니다
Device Discovery 절차를 진행하고 나면 AVContinuityDevice에 엑세스할 수 있죠 여기에는 audioSessionPorts 프로퍼티가 있습니다
포트 유형을 포함한 오디오 기기에 대한 정보는 이 프로퍼티에서 쿼리할 수 있습니다
연속성 마이크용 새로운 포트 유형이 있는데요 이 포트를 식별자로 쓰는 것이 좋습니다 앱에서 입력 기기의 유형에 따라 특정 작업을 하고 싶다면요
하지만 이 절차는 AVContinuityDevice에 속하는 iPhone 및 iPad에서만 작동하죠
기존의 Audio Session API를 계속 사용하여 시스템에 사용 가능한 입력을 질의합니다
AirPods나 블루투스 마이크의 기존 포트 유형은 iOS에서 이전되었습니다 캡처 기기의 사용 가능성에 기반하여 마이크 기기의 사용 가능성과 tvOS에서 그것을 모니터하는 방법을 알아보죠 Apple TV에는 내장 마이크가 없어서 여러분의 앱이 항상 마이크 기기에 액세스할 수 있는 건 아닙니다 이 때문에 Audio Session의 InputAvailable 프로퍼티에는 키-값 관찰 지원이 있어서 사용할 수 있는 마이크 기기가 있는지 없는지 모니터할 수 있죠
이 프로퍼티를 반드시 확인하시는 것이 좋습니다 마이크 사용 가능성에 동적 변화가 있을지 모르니까요 이것은 또한 Audio Session을 활성화하고 I/O를 시작할 타이밍을 결정하며 마이크가 나타나거나 사라질 때 앱 상태를 처리하는 데 도움이 되죠
다음으로 iOS와 유사하게 tvOS에서도 녹음 허가 API를 쓸 수 있습니다 사용자가 앱의 마이크에 대한 접근을 승인했는지 확인하고 승인하지 않았다면 녹음 허가를 요청합니다
앱에 녹음 권한이 있는지 확인하시는 것이 좋습니다 I/O를 시작할 때 오류를 피하려면요
마지막으로 Audio Session에서는 입력을 지원하는 카테고리 및 모드 예를 들면 playAndRecord 카테고리나 음성 채팅 및 화상 채팅 같은 모드를 tvOS에서도 쓸 수 있습니다 AVAudioSessionTypes 헤더를 참고하면 어떤 Audio Session의 카테고리와 모드가 앱에 가장 잘 맞는지 결정할 수 있죠 tvOS 17 Audio Session의 변경 사항을 모두 알아보았습니다 이제 다양한 녹음 API와 권장 사용 예를 살펴보겠습니다
먼저, AVAudioRecorder입니다
오디오 파일로 기록하는 가장 간단한 방법이죠 마이크로 들어오는 소리를 그대로 녹음하기만 하면 되고 실시간 사용이 아닌 경우라면 AVAudioRecorder가 적합합니다 이것은 다양한 인코딩 포맷 특정 파일 포맷 샘플 레이트 등으로 구성되죠
다음은 AVCapture입니다 케빈이 이야기한 것처럼 기존의 iOS AVCapture API를 쓰면 기본적인 녹음 사용 환경에서 마이크에 액세스할 수 있죠 카메라와 마이크가 모두 작동한다면요 다음은 AVAudioEngine입니다
AVAudioEngine은 녹음 및 재생을 모두 지원합니다 간단한 것은 물론 복잡한 오디오 처리 사용 예에 대해서도요 그 예로는 노래방 앱이 있겠죠 그런 앱에서는 마이크로 입력된 사용자의 목소리를 분석하고 마이크 입력을 재생 트랙과 믹싱할 수 있습니다
앱이 실시간 오디오 I/O 주기와 직접 상호작용 해야 하는 경우도 있겠죠 AVAudioEngine은 실시간 인터페이스도 제공합니다
앱은 실시간 세이프렌더 콜백을 제공할 수 있죠 AVAudioSinkNode와 AVAudioSourceNode를 통해서요
또한 음성 처리 기능에도 액세스할 수 있습니다 AVAudioEngine으로요 하위 수준 인터페이스를 다루는 앱의 경우 그에 대응되는 iOS 메커니즘을 tvOS로도 가져왔습니다
비실시간 녹음 사용 예의 경우에는 AudioQueue를 씁니다 실시간 오디오 I/O 주기와 직접 상호작용 하려면 오디오 유닛 AU RemoteIO와 AU VoiceIO를 쓸 수 있죠 기존의 AudioUnit API를 통해서요
이런 API에 대해 더 자세한 정보는 Developer 웹 사이트에서 확인해 보세요 AVFAudio와 Audio Toolbox 프레임워크 항목입니다
만약 Apple TV에서 재생되는 마이크 스트림에 에코 캔슬링이 필요할 때가 있죠 예를 들면 회의에서 사용할 때요 저희의 음성 처리 API를 선택하는 것이 좋습니다 이유를 알아보죠 예를 들어 iPhone에서 흔히 나타나는 에코 캔슬링 문제와 비교해 보면 녹음과 재생이 같은 기기에서 이뤄집니다 tvOS 장치에서 달라지는 것은 다음과 같습니다 연속성 마이크가 활성화되면 녹음은 iPhone이나 iPad에서 이뤄지죠 그러나 재생은 tvOS 기기로 스트리밍되거나 임의의 TV 스피커 세트 홈 시어터 장치, 사운드 바 스테레오 HomePod에서도 재생될 수 있죠 이들 대부분은 5.1이나 7.1 LPCM 같은 고급 포맷을 재생할 수 있고 고유한 오디오 처리 스타일로 사용자 경험을 향상시킵니다 이와 함께 일반적인 Apple TV 설정에서는 마이크 기기에서 사용자가 몇 미터 떨어진 것을 가정하므로 마이크 기기가 큰 소리로 울리는 재생 기기와 훨씬 더 가까이 있을 수 있죠
이 모든 시나리오는 에코 제어 문제를 어렵게 만듭니다 Apple TV에서 나오는 모든 재생음을 로컬 환경에서 고음질의 오디오를 캡처하는 동안 삭제해야 한다면요 이런 어려움을 극복할 수 있도록 tvOS 17에는 새로운 음성 처리 및 에코 캔슬링 기술이 들어갔습니다 기존의 iOS API를 채택하기만 해도 이것을 이용할 수 있습니다 이와 같은 역할을 하는 tvOS API는 AVAudioEngine입니다 여기서 inputNode에 setVoiceProcessingEnabled를 호출하기만 하면 되죠 AU VoiceIO 오디오 유닛으로도 액세스 가능한데 VoiceProcessingIO subtype을 이용합니다 저희의 음성 처리 API의 자세한 사항과 API가 제공하는 기능은 '음성 처리의 새 기능' 세션을 참고하시면 좋습니다 이것으로 올해 tvOS 17에 추가된 오디오 API 소개는 마치겠습니다
이제 우리 앱으로 돌아가서 앱 안에서 이런 마이크 기능을 어떻게 이용하는지 살펴보겠습니다
Xcode로 돌아가 AudioCapturer 클래스를 열어 보죠
이 클래스는 앱 코드의 나머지 부분에서 모든 차이점을 추출합니다
AVAudioEngine의 자체 인스턴스를 갖고 있는데 AVAudioEngine은 이 인스턴스에서 쓸 녹음 API죠
이것은 Audio Session의 공유 인스턴스도 가집니다
이 클래스가 무엇을 하는지 간단히 살펴볼게요 상위 수준에서는 활성화 이전에 Audio Session 카테고리와 모드를 설정하고 기본 AVAudioEngine을 올바른 형식으로 설정합니다
또한 사용자 입력 노드에서 음성 처리를 설정하죠 그것을 우회하는 사용자 제어 토글로요
이 예제에서는 엔진을 비실시간 콘텍스트에서 실행합니다 이제 tvOS로 변경할 때 필요한 사항을 알아보겠습니다 이 iOS 앱은 tvOS용으로 그대로 빌드합니다 마이크 기기가 언제든 사용 가능하다고 가정해서요 여기서 해야 할 일은 관찰자를 추가해서 inputAvailable KVO 알림을 확인하게 하는 것입니다 입력 마이크 기기가 사용 가능한지 확인하기 위한 거죠 그런 다음 Audio Session과 I/O를 차례로 시작합니다 관찰자를 이곳에 추가하겠습니다
또한 반드시 해야 할 일은 앱의 상태를 처리하는 겁니다 마이크 기기가 나타나거나 시스템에서 사라지는 경우에요 사라지는 경우는 사용자가 세션 중에 Apple TV와 연결을 끊을 때일 수도 있죠
이제 제 Apple TV에서 잘 작동하겠죠, 실제로 보겠습니다
제 앱의 오디오 모드로 들어왔습니다 재생을 누르면 노래가 재생됩니다 그런 다음 제 말소리를 녹음하겠습니다
이 노래 참 근사한데요? 들을 때마다 춤을 추고 싶다니까요
재밌네요 이제 우리가 봤던 음성 처리 모드에서 Apple TV에서 재생된 이 노래는 지워지고 로컬 환경의 오디오만 남아 앱으로 보내지겠죠
이 노래 참 근사한데요? 들을 때마다 춤을 추고 싶다니까요
이것이 바로 tvOS의 에코 캔슬링입니다
이제 끝났습니다, 지금까지 살펴본 내용을 요약해 보죠
저희는 상위 수준 기능을 소개했습니다 tvOS에서 어떤 장르의 앱을 새롭게 쓸 수 있을지도 얘기했고 그런 다음 새로운 Device Discovery API도 알아봤죠 이 API는 기기 선택기를 표시하고 연속성 기기를 선택합니다 tvOS에서 쓸 수 있는 카메라와 마이크도 알아봤습니다 마지막으로 기존의 카메라 및 마이크 앱을 tvOS용으로 수정했습니다 최대한 많은 코드를 그대로 유지하면서 Device Discovery 부분만 추가했죠 또한 tvOS 관련 고려 사항도 몇 가지 요약해 보았습니다 여러분이 카메라와 마이크 지원을 tvOS 앱에 추가할 수 있게 돼 정말 기쁩니다 이 플랫폼의 새로운 기능을 써서 여러분이 개발할 앱을 빨리 보고 싶습니다 감사합니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.