AVAudioSession類由AVFoundation框架引入。每一個iOS應用都有一個音頻會話。這個會話能夠被AVAudioSession類的sharedInstance類方法訪問,以下html
setCategory: AVAudioSessionCategoryPlaybackios
error: &setCategoryErr];session
//設置音頻是否啓用app
[[AVAudioSession sharedInstance]框架
setActive: YESide
error: &activationErr];優化
AVAudioSessionCategorySoloAmbientui
這個類別很是像AVAudioSessionCategoryAmbient類別,除了會中止其餘程序的音頻回放,好比iPod程序。當設備被設置爲靜音模式,你的音頻回放將會中止。spa
AVAudioSessionCategoryRecord.net
這會中止其餘應用的聲音(好比iPod)並讓你的應用也不能初始化音頻回放(好比AVAudioPlayer)。在這種模式下,你只能進行錄音。使用這個類別,調用AVAudioPlayer的prepareToPlay會返回YES,可是調用play方法將返回NO。主UI界面會照常工做。這時,即便你的設備屏幕被用戶鎖定了,應用的錄音仍會繼續。
AVAudioSessionCategoryPlayback
這個類別會靜止其餘應用的音頻回放(好比iPod應用的音頻回放)。你可使用AVAudioPlayer的prepareToPlay和play方法,在你的應用中播放聲音。主UI界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放都會繼續。
AVAudioSessionCategoryPlayAndRecord
這個類別容許你的應用中同時進行聲音的播放和錄製。當你的聲音錄製或播放開始後,其餘應用的聲音播放將會中止。主UI界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放和錄製都會繼續。
AVAudioSessionCategoryAudioProcessing
這個類別用於應用中進行音頻處理的情形,而不是音頻回放或錄製。設置了這種模式,你在應用中就不能播放和錄製任何聲音。調用AVAPlayer的prepareToPlay和play方法都將返回NO。其餘應用的音頻回放,好比iPod,也會在此模式下中止。
AVAudioSessionCategoryAmbient
這個類別不會中止其餘應用的聲音,相反,它容許你的音頻播放於其餘應用的聲音之上,好比iPod。你的應用的主UI縣城會工做正常。調用AVAPlayer的prepareToPlay和play方法都將返回YES。當用戶鎖屏時,你的應用將中止全部正在回放的音頻。僅當你的應用是惟一播放該音頻文件的應用時,靜音模式將中止你程序的音頻回放。若是正當iPod播放一手歌時,你開始播放音頻,將設備設爲靜音模式並不能中止你的音頻回放。
2016-07-26
本文內容主要來源於 Working with Categories。
對於 Audio Session 來講,與之對應的 Category 是闡釋其音頻行爲的關鍵信息。好比:你的 App 的聲音是否應該受到手機的靜音鍵的控制、你的 App 使不使用音頻輸入或輸出、其餘音樂可否和你的 Audio 共存播放等等。
每一種 Category 都指定了是否支持下列這些能力:
Interrupts non-mixable apps audio
:是否打斷不支持混音播放的應用。若是是,則當你的應用的音頻開始播放時,則那些不支持混音播放的應用的音頻會被打斷。Silenced by the Silent switch
:是否響應手機靜音鍵。若是是,則當手機靜音鍵被撥至靜音狀態時,你的音頻會被靜音。Supports audio input
:是否支持音頻輸入。若是是,你的應用就能夠錄音。Supports audio output
:是否支持音頻輸出。若是是,你的應用就能夠播放音頻。下面是各類 Category 的能力表格:
Category | 是否會被靜音鍵或鎖屏鍵靜音 | 是否打斷不支持混音播放的應用 | 是否容許音頻輸入/輸出 |
---|---|---|---|
AVAudioSessionCategoryAmbient | Yes | NO | 只輸出 |
AVAudioSessionCategoryAudioProcessing | - | YES | 無輸入和輸出 |
AVAudioSessionCategoryMultiRoute | NO | YES | 支持輸入和輸出 |
AVAudioSessionCategoryPlayAndRecord | NO | 默認 YES,可重寫開關置爲 NO | 支持輸入和輸出 |
AVAudioSessionCategoryPlayback | NO | 默認 YES,可重寫開關置爲 NO | 只輸出 |
AVAudioSessionCategoryRecord | NO(鎖屏時依然保持錄製) | YES | 只輸入 |
AVAudioSessionCategorySoloAmbient | YES | YES | 只輸出 |
大部分應用只須要在啓動時設置一下 Category 便可,不過你是能夠隨時修改 Audio Session 的 Category,也能夠隨時激活和關閉 Audio Session。當你的 Audio Session 是 Inactive 的,Category 的請求會在你激活它時發送,若是是 Active 的,則當即發送。
每一種 Category 最準確的行爲定義是由系統控制而不是你的應用,蘋果可能會在未來從新定義不一樣的 Category 的行爲,因此你最好是選擇一種與你的應用使用音頻方式匹配的 Category 來用。
下面列一下各類 Category 的使用場景:
AVAudioSessionCategoryAmbient,只支持音頻播放。適用於把音頻做爲輔助性元素而非不可獲取特性的應用,使用這個 Category,你的音頻會被靜音鍵和鎖屏鍵靜音。
AVAudioSessionCategorySoloAmbient,這個是默認使用的 Category,只支持音頻播放。音頻會被靜音鍵和鎖屏鍵靜音。這個 Category 和 AVAudioSessionCategoryAmbient 的惟一不一樣在於它會打斷其餘應用的音頻播放。
AVAudioSessionCategoryPlayback,只支持音頻播放。你的音頻不會被靜音鍵和鎖屏鍵靜音。當你的應用把音頻播放做爲重要功能時,你可使用這個 Category。
有一點須要注意的是,當你選擇那些支持在靜音鍵切到靜音狀態以及鎖屏鍵切到鎖屏狀態下仍然支持你的音頻繼續播放的 Category 時,你必須在你的應用中開啓 Background Audio 的能力,詳見UIBackgroundModes。而且,一般你不該該經過 idleTimerDisabled 接口關閉系統的 Sleep Timer。若是你關閉了,那你應該把 idleTimerDisabled 置回 NO,以避免你的應用會禁止自動屏幕鎖定,畢竟鎖屏並不會影響你的音頻播放,你幹嗎關閉它呢。Sleep Timer 能夠確保你的屏幕在用戶無操做一段時間後自動變暗並鎖定來省電。
除了 AVAudioSessionCategoryMultiRoute 外,其餘的 Category 都遵循 last in wins 原則,即最後接入的音頻設備做爲輸入或輸出的主設備。
AVAudioSessionCategoryMultiRoute 並非簡單的遵循 last in wins 原則,AVAudioSessionCategoryMultiRoute 容許你的使用全部鏈接的輸出接口而不只是最後連上的接口。好比,當你正在經過 HDMI 輸出路徑聽音頻,這時又插上了耳麥,你的應用能夠同時在 HDMI 和耳麥都輸出音頻。
在 AVAudioSessionCategoryMultiRoute 下,你的應用能夠發送不一樣的音頻流到不一樣的輸出路徑。例如,你的應用能夠將一條音頻流發送到你的左耳麥,另外一條音頻流發送到右耳麥,並將第三條流發送到 HDMI 路徑。以下圖所示:
AVAudioSessionCategoryMultiRoute 支持下列輸出組合:
AVAudioSessionCategoryMultiRoute 支持單輸入接口。
代碼以下:
NSError *setCategoryError = nil;
BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError];
// BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError];
if (!success) { /* handle the error in setCategoryError */ }
正如使用 Category 能夠定製應用的音頻行爲,咱們使用 Mode 則能夠定製 Category 的行爲。可選的 Mode 有這些:
Mode | 兼容的 Category |
---|---|
AVAudioSessionModeDefault | All |
AVAudioSessionModeVoiceChat | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeGameChat | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeVideoRecording | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord |
AVAudioSessionModeMoviePlayback | AVAudioSessionCategoryPlayback |
AVAudioSessionModeMeasurement | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback |
AVAudioSessionModeVideoChat | AVAudioSessionCategoryPlayAndRecord |
除了這些 Mode 外,有時在定製你的 Category 時,你還須要使用到一些 Option:
Option | 說明 | 兼容的 Category |
---|---|---|
AVAudioSessionCategoryOptionMixWithOthers | 容許和其餘音頻 mix | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionDuckOthers | 智能調低衝突音頻音量 | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionAllowBluetooth | 容許藍牙音頻輸入 | AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionDefaultToSpeaker | 默認輸出音頻到揚聲器 | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionModeDefault,默認模式能夠與全部的 Category 兼容使用,並配置設備用於通常用途。
AVAudioSessionModeVoiceChat,通常用於 VoIP 類型的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord Category。在這個模式下,用於音頻的信號會由系統提供的信號處理程序優化,而且這個模式會配置上 AVAudioSessionCategoryOptionAllowBluetooth 這個選項。這個設置下,當系統內置麥克風被使用時,系統會自動選擇最佳內置麥克風組合支持語音聊天,從而優化語音聊天體驗。
AVAudioSessionModeVideoChat,通常用於視頻聊天應用,好比 FaceTime。這個模式只用於 AVAudioSessionCategoryPlayAndRecord Category。在這個模式下,用於音頻的信號會由系統提供的信號處理程序優化,而且這個模式會配置上 AVAudioSessionCategoryOptionAllowBluetooth 和 AVAudioSessionCategoryOptionDefaultToSpeaker 選項。這個設置下,當系統內置麥克風被使用時,系統會自動選擇最佳內置麥克風組合支持視頻聊天,從而優化視頻聊天體驗。
蘋果推薦音頻或視頻聊天應用也使用 Voice-Processing I/O Unit,這個模塊提供了一系列的特性來支持 VoIP 類應用。
AVAudioSessionModeGameChat,通常用於遊戲類應用。使用 GKVoiceChat 對象的應用會自動設置這個模式和 AVAudioSessionCategoryPlayAndRecord Category。這個模式使用的路徑參數和 AVAudioSessionModeVideoChat 一致。
AVAudioSessionModeVideoRecording,通常用於須要使用攝像頭採集視頻的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord 和 AVAudioSessionCategoryRecord 這兩個 Category。在這個模式下,信號會被系統提供的信號處理程序修改。這個模式與 AVCaptureSession API 結合來用能夠更好地控制音視頻的輸入輸出路徑。好比,經過設置 automaticallyConfiguresApplicationAudioSession 屬性可讓系統根據所使用的設備自動選擇最佳輸出路徑。
AVAudioSessionModeMeasurement,通常用於那些要最小化系統自帶的音視頻信號處理流程對信號的影響的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord、AVAudioSessionCategoryPlayback 這幾種 Category。輸入信號由設備的主麥克風來路由。
AVAudioSessionModeMoviePlayback,通常用於播放電影或其餘視頻的應用。這個模式只用於 AVAudioSessionCategoryPlayback Category。
如下 Category 支持「鏡像」和「非鏡像」版本的 AirPlay:
此外:
Mode 只有在和 AVAudioSessionCategoryPlayAndRecord Category 配合使用時才支持 AirPlay,下面的 Mode 只支持「鏡像」版本的 AirPlay:
你能夠有多種方式來調優 Category,下面舉幾個例子:
從 iOS7 以後,錄製音頻的權限須要用戶受權才能得到。若是用戶不給你權限,那麼你錄製的就是靜音。當你使用一個須要錄製權限的 Category 來定製你的 Audio Session 時,系統會自動彈出權限申請提示給用戶。
除了讓系統自動彈出權限申請提示外,你還能夠經過 requestRecordPermission: 方法來向用戶請求權限。