## 簡介
IOS通過<em>audio sessions</em>和AVAudioSession中的<strong>API</strong>來實現對于不同app之間、同一app內及硬件層面的各種音頻行為。
<center>

</center>
AVAudioSession中的API可以處理類似這樣的問題:
- 手機在從鈴聲切換到靜音模式時,app中的音頻是否需要靜音?舉例來說,旨在幫助用戶在會議中做筆記的app應當在靜音模式下靜音,以免打擾他人;而具有發音功能的詞典類app則應保證不被靜音模式影響,在用戶需要的時候播放聲音。
- 當app的音頻開始播放的時候,系統在播放的其他音頻是否應該繼續?在類似讓用戶跟著伴奏利用app中的功能一起合奏的app中,背景音樂當然要繼續;但如果app的功能是網絡電臺,那么就應該讓其他的聲音都停止。
IOS設備中的音頻使用場景十分復雜:用戶隨時可能插拔耳機、接打電話,系統的鬧鐘也可能在使用其他音頻的過程中a響起。通過使用audio session中的API來作出特定的配置,只需使用很少的代碼就可以優雅的對系統請求作出回應。
----------
###概覽
使用AVAudioSession可以:
- 選擇合適的輸入/輸出源(route)
- 決定如何從其他app中集成音頻
- 處理來自其他app的“騷擾”
- 為某一的類型的app自動配置音頻?(automatically configure audio for the type of app you are creating)
####音頻會話(Audio Session)包含了一系列的音頻行為
音頻會話是app和IOS之間的媒介,用來為app配置相關的音頻屬性和行為。在加載過程中,app會自動創建一個音頻會話的單例。
####用類別(categories)描述音頻身份(role)
音頻會話類別是用來描述音頻行為的主要機制。通過設置類別可以表明:app是否使用輸入/輸出源,在播放音頻時是否支持其他背景音樂的播放和其他屬性。開發者設計的音頻行為應當符合用戶的期望。
開發者可以通過七個類別和一些override and modifier switches,結合app的身份來定制音頻行為。不同的類別分別支持后臺播放(playback)、錄音和后臺錄音等功能。當系統了解app的音頻身份后,會為app提供合適的硬件資源,令其免于受到設備上的其他音頻事件的干擾。
####模式刻畫類別(Modes Customize Categories)
用戶對于特定種類的app的(音頻)表達方式會有特定的期待。模式被用來刻畫類別的行為。舉例來說,系統可能會為使用默認模式和錄像模式的app選擇不同的麥克風,或者為用于錄像場景的app啟用麥克風信號處理。
####基于通知(Notifications)的中斷處理機制(interruption handling)
音頻中斷是指是app的音頻會話的激活狀態失效,并導致app音頻馬上終止的行為。如果一個未被系統歸類為可以和自己的音頻會話混合的其他會話被激活,就會對app產生中斷。當會話被中斷時,系統會向app發出一個“你被中斷”信號。app可以在接到這個信號的時候完成保存狀態、更新UI等操作。
開發者可以通過向AVAudioSession中的AVAudioSessionInterruptionNotification注冊來處理中斷。編寫自己的中斷開始及中斷結束方法,以便對用戶造成盡可能小的中斷操作,并提供最優雅的恢復方案。
####基于通知的音頻源切換處理
用戶在插拔外接音頻設備或插拔耳機的時候,會期待系統能夠按自己的想法進行輸入輸出源的切換。《IOS Human Interface Guidelines》中關于聲音的章節描述了這些用戶期待,并提供了一些關于如何滿足這個期待的指導。通過在AVAudioSessionRouteChangeNotification中注冊來處理音頻源的切換。
####類別的特性可調整
開發者可以用不同的方式來對音頻會話類別進行調整,來改變類別的屬性,包括:
* 允許(缺省條件下不能與其他音頻混合的)類別與其他(來自QQ音樂等app的)音頻混合。
* 將音頻的輸出源從輸入源改為擴音器。
* 允許藍牙音頻輸入源。
* 在app的音頻播放時,要求其他的音頻減小音量。
* 在運行時為app選擇最優的硬件設備。在app運行時,開發者的代碼可以根據當前的設備環境及用戶插拔設備引發的變化,進行動態的調整和適應。
####前置知識
在學習這些內容前,開發者需要對Cocoa Touch開發有一定的了解(App Programming Guide for IOS中關于Core Audio和Core Audio Overview中的章節)。同時,由于音頻會話通常會基于終端用戶實際的使用場景,因此也需要對IOS設備,和IOS Human Interface Guidelines(特別是Sound章節)有所了解。
####其他
參見以下資料:
* AVAudioSession Class Reference,官方手冊中關于AudioSession類的介紹
* AddMusic,樣例代碼,展示如何協調app間的音頻操作
>
以上內容翻譯自[蘋果官方文檔](https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Introduction/Introduction.html),僅供學習,請勿用于商業用途,侵刪。轉載注明出處。