스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
AirPods으로 앱의 오디오 경험 향상하기
AirPods을 사용하여 앱에 혁신적인 오디오 경험을 제공하는 방법을 알아보세요. AirPods 자동 전환 기능을 결합하는 법, AVAudioApplication으로 음소거를 지원하는 법, 공간 음향을 활용하여 앱이나 게임에서 몰입감 있는 사운드 환경 조성하는 법을 살펴봅니다.
챕터
- 4:20 - AirPods Automatic Switching for macOS
- 6:41 - Press to Mute and Unmute
- 12:02 - Spatial Audio with AirPods
리소스
관련 비디오
WWDC23
WWDC21
-
다운로드
♪ ♪
안녕하세요 이번 세션에서는 AirPods을 사용해 앱의 오디오 경험을 향상하는 방법을 살펴보겠습니다 iOS 17 및 macOS 14에서 공개한 몇 가지 AirPods 기능을 소개하죠 제 이름은 수라지입니다 Apple의 헤드폰 및 액세서리 소프트웨어 엔지니어링 팀에서 일하고 있죠 그럼 시작해 볼까요?
전 세계 사람들이 AirPods을 애용합니다 언제나 최상의 개인 오디오 경험을 제공하기 때문이죠 매일 수백만 명이 AirPods으로 음악을 듣고 영화를 보고 주변 사람과 FaceTime을 하고 업무 통화를 하고 업무를 처리합니다 또한 AirPods은 Apple Watch에서 Mac에 이르기까지 Apple 생태계 전반에서 사용되죠 iOS 17 및 macOS 14에 멋진 기능을 도입했습니다 플랫폼 전반에서 AirPods을 사용하는 게 더욱 쉽고 간편해졌죠 지금부터 이러한 기능이 AirPods의 가장 일반적인 용도를 어떻게 바꾸는지 알아봅시다 iPhone에 AirPods을 연결해 개인 맞춤형 공간 음향으로 음악을 즐기다가 업무 회의에 참여하라는 알림을 받습니다 통화에 참여하려고 Mac을 열면 AirPods 연결 배너가 여러분을 맞이합니다 AirPods이 준비되었고 Mac에 연결되었음을 알려 주죠
그런 다음 회의에 참여하면 예상대로 Mac의 오디오가 AirPods을 통해 재생됩니다 iPhone에서 듣던 음악은 일시 정지되죠 업무 통화 중에 사무실 직원이 얘기하러 오거나 원격 근무 중에 배달원이 초인종을 누르는 경우가 있는데요
이제 AirPods 몸통을 눌러 통화 중 음소거가 가능합니다 음소거를 하면 친절한 마이크 상태 배너와 신호음으로 알림을 받게 되죠
예상하신 대로 AirPods 몸통을 다시 누르면 음소거를 해제하고 회의를 계속할 수 있습니다 물론 그때도 배너가 나타나고 신호음이 들리죠
드디어 업무 회의가 끝나고 휴식 시간입니다 iPhone에서 좋아하는 Apple Music 플레이리스트를 재생하면 iPhone의 오디오가 AirPods으로 매끄럽게 전환됩니다 한 박자도 놓치지 않고 일과를 이어 나갈 수 있죠
여러분의 앱에 마법 같은 AirPods 경험을 구현하고 싶으신가요? AirPods 사용자가 플랫폼에 구애받지 않고 쉽게 앱을 사용하면 좋겠죠?
이번 세션에서 알아볼 내용은 앱을 최적화하여 이러한 기능을 활용하고 전달하는 방법입니다 먼저 macOS 14의 AirPods 자동 전환 기능과 앱에서 이를 최대한 활용하는 모범 사례를 알아보겠습니다
그런 다음 iOS 17 및 macOS 14의 눌러서 음소거 및 음소거 해제 지원을 살펴보죠 마지막으로 공간 음향과 Apple 플랫폼의 공간 음향 지원을 알아보겠습니다
macOS의 AirPods 자동 전환부터 시작하죠
macOS 14은 사용자의 동작에 따라 기기 간 AirPods 자동 전환을 지원합니다 자동 전환 알고리즘은 '지금 재생 중' 등록이나 입력 오디오 활동 등을 지표로 삼아 이러한 결정을 내리죠 좋은 소식은 모든 App Store 앱뿐만 아니라 앱 샌드박스를 쓰거나 쓰지 않는 App Store 외부의 앱까지 별도의 조치 없이 이 기능을 적용할 수 있다는 겁니다 개발자가 아무것도 바꾸지 않아도 기능을 온전히 사용할 수 있죠 이제 이러한 기능을 통해 최적의 AirPods 경험을 제공하는 모범 사례를 살펴보겠습니다 macOS에서 지금 재생 중에 등록하면 자동 라우팅 알고리즘이 긴 형식의 오디오가 재생되는 시점을 파악해 올바른 라우팅을 결정할 수 있습니다
미디어 앱이나 스트리밍 앱의 경우 지금 재생 중에 등록하는 걸 권장합니다 오디오의 우선순위를 올바르게 정할 수 있게요
회의나 게임 앱의 경우 지금 재생 중에 등록하지 않는 게 좋습니다
또한 알림 및 앱별 신호음 재생을 위해 오디오 서비스 API를 사용하시길 권장합니다 이렇게 하면 알림과 미디어 콘텐츠를 구분하고 돌발 동작을 방지할 수 있죠 회의 앱의 경우 입력 마이크는 회의나 음성 세션이 시작할 때만 사용하고 실시간 회의나 음성 세션이 진행되는 동안만 열어 두세요 미디어 앱의 경우 사용자가 선택한 디폴트 라우트로 오디오를 재생하는 게 좋습니다 또한 사용자가 오디오를 멈춘 후에 무음으로 재생하지 마세요 무음으로 재생해야 한다면 2초 미만으로 유지하세요 다음은 AirPods의 눌러서 음소거와 음소거 해제입니다 iOS 17 및 macOS 14에서는 통화 중에 사용 가능한 눌러서 음소거 및 음소거 해제 기능으로 AirPods 경험에 편의성을 더했습니다 이제 통화 중에 AirPods 몸통을 누르기만 하면 앱의 마이크를 음소거하거나 음소거를 해제할 수 있습니다 iOS 17부터 모든 CallKit 앱에 눌러서 음소거 및 음소거 해제 기능이 지원되며 별도의 작업은 전혀 필요하지 않습니다 CallKit을 사용하지 않는 커뮤니케이션 앱의 경우 새로운 API를 도입했으며 곧 자세히 설명해 드리겠습니다 어떤 경우든 iOS 17은 음소거 제스처에 응답하여 업링크 오디오를 음소거하고 알림음을 울립니다 그리고 앱에 음소거됐음을 알리죠 동일한 제스처를 다시 트리거하면 iOS 17이 업링크 오디오의 음소거를 해제하고 알림음을 울립니다 그러고는 음소거가 해제됐음을 앱에 알리죠 이 기능은 사용자에게 엄청난 편의성을 제공합니다 iOS 17에 얼마나 빨리 추가할 수 있는지 보여 드리죠
AVAudioApplication을 소개하게 되어 기쁩니다 AVAudioSession 제품군의 새 형제죠 AVAudioApplication을 통해 앱 전반의 오디오 동작을 구성할 수 있습니다
AVAudioApplication을 사용해 얼마나 빠르게 눌러서 음소거 및 음소거 해제를 결합할 수 있는지 보여 드리죠 우선 AVFAudio를 불러옵니다 다음으로 AVAudioApplication의 공유 인스턴스를 가져옵니다 그런 다음 Notification Center에 음소거 제스처 변경 알림을 등록합니다 이러면 눌러서 음소거 및 음소거 해제가 앱에 적용됩니다
이러한 알림은 음소거 제스처로 인해 음소거 상태가 변경되면 알려 주죠 이제 사용자 정보의 AVAudioApplication 입력 muteStateKey를 분석하여 새 상태를 결정합니다
이 알림을 수신하고 나면 알림이 실행된 결과로 내부 상태와 UI를 업데이트할 수 있게 되죠 추가로 앱 내에서 음소거 동작을 수행할 때는 AVAudioApplication을 업데이트해야 합니다
예상하셨듯 setter와 getter를 모두 제공하죠
iOS 17에서 앱에 눌러서 음소거 및 음소거 해제를 결합하는 건 이렇게 쉽습니다
이제 Mac으로 넘어가죠 주의하실 점은 macOS 14에서는 눌러서 음소거 및 음소거 해제가 약간 다르게 작동한다는 겁니다 음소거 상태가 변경되면 앱이 알림을 받는 건 iOS와 같죠 하지만 macOS에서는 제스처가 수행됐을 때 업링크 오디오를 음소거하는 건 앱의 몫입니다
추가적인 API도 적용해야 하는데요 잠시 후에 자세히 설명하겠습니다
마지막으로 알아 둘 점입니다 앱에서 음소거된 발화자를 인식하려는 경우 '음성 처리 API의 새 기능' 세션에서 이를 지원하는 새로운 API를 자세히 알아보세요
이번에는 Mac에 필요한 설정을 살펴보죠 macOS 14에서는 음소거 제스처의 결과로 업링크 오디오를 음소거하는 게 앱의 몫이라는 점을 잊지 마세요 AVAudioApplication의 공유 인스턴스에서 Mute State Change 핸들러를 설정해야 합니다 이 핸들러는 음소거 제스처를 수행할 때 호출되죠 업링크 오디오를 음소거하고 내부 상태를 업데이트합니다 또한 음소거 동작이 앱의 현재 사용 방식에 적합하지 않은 경우 거부할 기회도 제공합니다 이 핸들러는 UI 업데이트에 사용하지 않는 게 좋습니다 음소거 상태가 변경될 때 Input Mute State Change 알림을 계속 받게 되기 때문이죠 추가로 CoreAudio 프레임워크에 제공한 새로운 프로퍼티를 통해 프로세스의 모든 입력 오디오를 빠르게 음소거할 수 있습니다
이 프로퍼티를 활성화하면 프로세스에 대한 입력 오디오를 음소거하면서 IO는 그대로 계속 수행하죠
마지막으로 AirPods의 공간 음향을 알아보겠습니다 AirPods의 공간 음향은 전 세계 사람들이 음악을 듣는 방식을 바꿨습니다 오늘날 Apple Music 구독자 80% 이상이 공간 음향으로 음악을 듣죠 iOS 16을 출시하면서 개인 맞춤형 공간 음향으로 이 기능을 한 단계 끌어올렸습니다 머리나 귀의 크기 및 모양에 따라 소리를 인지하는 방식이 사람마다 다르기 때문이죠 이러한 개인 맞춤 기능 향상은 사용자들의 호평을 받았습니다 macOS 14 및 iOS 17, tvOS 17 세 플랫폼 모두에서 공간 음향을 계속 지원하게 되어 기쁩니다
macOS에서는 AVPlayer의 공간 음향과 더불어 AVSampleBufferAudioRenderer API를 지원합니다 iOS 및 tvOS에서는 AURemoteIO의 공간 음향 AudioQueue API와 더불어 방금 언급한 API를 지원합니다
AudioQueue 및 AURemoteIO의 공간 음향에는 API 인터페이스가 없다는 점에 주의하세요 대신 지금 재생 중에 등록한 앱에 자동으로 활성화되죠
이는 사용자가 Control Center를 통해 기능을 구성하는 옵션을 제공합니다
지금까지 macOS에서 사용자와 앱이 AirPods 자동 전환의 이점을 얼마나 쉽게 누릴 수 있는지 알아봤습니다 사실 대부분의 경우 업데이트를 적용하기 위해 해야 할 작업은 없습니다 또한 AirPods의 안정적인 자동 전환 경험을 위해 앱에서 할 수 있는 일을 살펴봤습니다
AVAudioApplication API와 이 API를 통해 눌러서 음소거 및 음소거 해제를 지원하는 방법도 소개했죠
마지막으로 모든 플랫폼에서 전 세계 고객에게 AirPods 공간 음향을 제공하는 방법도 알아봤습니다 관련 세션을 참조하여 앱에 공간 음향을 지원하는 방법과 지금 재생 중에 등록하는 방법도 알아보세요 저희 팀이 즐겁게 준비한 만큼 유익한 세션이었기를 바랍니다 새 기능을 여러분과 고객분들에게 공유하게 되어 매우 기쁩니다 이러한 기능이 여러분의 앱에 적용된 모습을 기대할게요 감사합니다
-
-
8:25 - Press to Mute and Unmute API
// Adopting AVAudioApplication into your App import AVFAudio // Get the started instance let instance = AVAudioApplication.shared // Register for mute gesture notifications on Notification Center AVAudioApplication.inputMuteStateChangeNotification // Key for mute state AVAudioApplication.muteStateKey // Updating AVAudioApplication’s mute state instance.setInputMuted(...) // Reading AVAudioApplication’s mute state instance.isInputMuted
-
10:52 - Configure the Input Mute State Change handler (macOS only)
// Configure the Input Mute State Change handler (macOS only) instance.setInputMuteStateChangeHandler { isMuted in //... return didSucceed } // Optional: let CoreAudio mute your input for you (macOS only) // Define the Core Audio property var inputeMutePropertyAddress = AudioObjectPropertyAddress( mSelector: kAudioHardwarePropertyProcessInputMute, mScope: kAudioObjectPropertyScopeInput, mElement:kAudioObjectPropertyElementMain) // Enable this property when you want to mute your input UInt32 isMuted = 1; // 1 = muted, 0 = unmuted AudioObjectSetPropertyData(kAudioObjectSystemObject, &inputeMutePropertyAddress, 0, nil, UInt32(MemoryLayout.size(ofValue: isMuted), &isMuted)
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.