AVAudioSession(2):定義一個 Audio Session

本文轉自:AVAudioSession(2):定義一個 Audio Session | www.samirchen.com

本文內容主要來源于 Defining an Audio Session

Audio Session 的默認行為

AVAudioSession 的默認行為如下:

  • 音頻播放能力是開啟的,但是音頻錄制能力是關閉的。
  • 當用戶通過靜音鍵切換到靜音模式時,你的音頻會被靜音。
  • 當用戶通過鎖屏鍵鎖定屏幕或者自動鎖屏定時觸發時,你的音頻會被靜音。
  • 當你的音頻開始播放時,正在播放的其他 App 的音頻會被靜音。

這些行為是由默認的 AVAudioSessionCategorySoloAmbient Category 設定的。通常默認設置是不能滿足你的需求的,除非你的 App 對音頻的控制場景如下:

  • 你的 App 只使用 System Sound Services 或者 UIKit 中的 playInputClick 方法來處理音頻,而沒有用到其他音頻相關的 API 時。
  • 你的 App 不使用任何音頻。

系統如何解決競爭性的音頻請求

流程大致如下圖,還是挺好理解的:

image

需要注意的是,系統永遠遵循一個原則:電話的優先級最高。

和 AVCaptureSession 協同

在 AV Foundatin capture 相關的 API 中(AVCaptureDevice, AVCaptureSession)允許你從攝像頭和麥克風采集同步的音視頻數據。其中表示麥克風的 AVCaptureDevice 對象可以共享你的 AVAudioSession。通常情況下,如果 AVCaptureSession 需要使用麥克風進行音頻錄制時,它會去修改優化你的 AVAudioSession 配置。如果你不希望這樣,則需要設置對應的 AVCaptureSession 對象的 automaticallyConfiguresApplicationAudioSession 屬性為 NO 來讓 AVCaptureSession 使用你當前的 AVAudioSession 配置而不會修改它。

初始化 Audio Session

代碼如下:

// implicitly initializes your audio session
AVAudioSession *session = [AVAudioSession sharedInstance];

音量和路徑控制

蘋果官方推薦使用 MPVolumeView 來控制音頻音量和路徑,MPVolumeView 提供了一個 Slider 來控制音量,提供了一個按鈕來供你選擇音頻輸出路徑。

你可以通過如下代碼來設置音頻輸出路徑到話筒:

[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];

但蘋果推薦你用 MPVolumeView 提供的路徑選擇按鈕來實現音頻輸出路徑切換。

響應遠程控制事件

通過響應 Remote Control Events 能讓你在播放音視頻內容時,可以響應來自鎖屏界面、外部設備等 App 外部的控制。

具體參見 Remote Control EventsMPNowPlayingInfoCenter Class Reference

激活和關閉 Audio Session

蘋果官方建議如果你需要用到 Audio Session,總是應該顯示地激活你的 Audio Session。并且參考 Setting Preferred Hardware Values 來設置相應的硬件參數。這樣可以在你使用 Audio Session 前來測試是否能成功激活,以便于做出正確的處理邏輯。

激活 Audio Session 代碼如下:

NSError *activationError = nil;
BOOL success = [[AVAudioSession sharedInstance] setActive:YES error:&activationError]; // Pass 'NO' when deactivate your audio session.
if (!success) { /* handle the error in activationError */ }

值得注意的是,大部分時候我們不需要關閉 Audio Session,除非是在 VoIP(Voice over Internet Protocol) 類應用、turn-by-turn 導航類應用和某些錄制類應用中。這時你需要注意:

  • 對于 VoIP 類應用,要確保 Audio Session 只在電話接聽中是 Active 的。當應用處于后臺時,保持應用為準備接聽電話的狀態,但應用的 Audio Session 應該是 Inactive 的。
  • 對于定位于 Recording Category 來使用 Audio Session 的應用,要確保只在錄制中設置 Audio Session 為 Active 狀態,在錄制開始前和錄制結束后要確保 Audio Session 為 Inactive 狀態以允許其他音頻的播放。

檢查是否有其他音頻正在播放

你可以通過 otherAudioPlaying 來檢查是否當前有其他應用的音頻正在播放。

比如你是一個自帶音效的游戲,當一個正在聽音樂的用戶打開你的游戲時,iOS 設計指南會建議你不要關閉用戶正在聽的音樂而播放你的游戲音效,這時候你怎么處理呢?你可以用上面的接口檢查一下,如果有聲音在播放則將你的音效靜音并設置 AVAudioSessionCategorySoloAmbient。

Inter-App Audio 特性

Inter-App Audio 特性允許一個 Node App 將它的音頻輸出給一個 Host App。也可以由 Host App 發送它的音頻給 Node App 進行處理,處理完后再發回給 Host App。Host App 需要設置一個 Active 的 Audio Session,而 Node App 則只在從 Host App 或系統接收音頻輸入時才需要一個 Active 的 Audio Session。

你可以使用下面這些規則來搭建 Inter-App Audio:

  • 為 Node App 和 Host App 都設置 「inter-app-audio」的 entitlement。
  • 為 Host App 設置 UIBackgroundModes 的 audio flag。
  • 為那些在與 Host App 連接時使用音頻輸入或輸出路徑的 Node App 設置 UIBackgroundModes 的 audio flag。
  • 為 Node App 和 Host App 都設置 AVAudioSessionCategoryOptionMixWithOthers 這個 Category。
  • 確保連接著 inter-app host 的 Node App 在接收來自系統的音頻或者輸出音頻時的 Audio Session 是 Active 的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容