AVAudioSession 概述
最近在做 webrtc 采集與播放音頻风秤,使用AVAudioSession進(jìn)行播放與錄音功能
蘋(píng)果的官方圖:
可以看到AVAudioSession就是用來(lái)管理多個(gè)APP對(duì)音頻硬件設(shè)備(麥克風(fēng),揚(yáng)聲器)的資源使用褒链。
舉例一下AVAudioSession可以做這些事情
設(shè)置自己的APP是否和其他APP音頻同時(shí)存在唁情,還是中斷其他APP聲音
在手機(jī)調(diào)到靜音模式下,自己的APP音頻是否可以播放出聲音
電話(huà)或者其他APP中斷自己APP的音頻的事件處理
指定音頻輸入和輸出的設(shè)備(比如是聽(tīng)筒輸出聲音甫匹,還是揚(yáng)聲器輸出聲音)
是否支持錄音甸鸟,錄音同時(shí)是否支持音頻播放
[AVAudioSession sharedInstance] 設(shè)置方法
通過(guò)主場(chǎng)景惦费、模式、細(xì)節(jié)選項(xiàng)的設(shè)置可以使app在音頻方面更加人性化抢韭。
每次的麥克風(fēng)轉(zhuǎn)換都是硬件調(diào)用,會(huì)有一定幾毫秒延時(shí),所以錄影錄或音后設(shè)定延時(shí)等待釋放后才轉(zhuǎn)換,不然換了也沒(méi)用
[[AVAudioSession sharedInstance]setActive:YES error:nil];//馬上設(shè)置
[[AVAudioSession sharedInstance]setActive:NO error:nil];//交出音頻會(huì)話(huà)
配置音頻設(shè)置薪贫,如采樣率,I / O緩沖區(qū)持續(xù)時(shí)間和通道數(shù) 處理音頻輸出更改 刻恭。
通過(guò)overrideOutputAudioPort:error:方法設(shè)置音頻會(huì)話(huà)的overrideOutputAudioPort屬性
音頻會(huì)話(huà)場(chǎng)景分類(lèi)設(shè)置:
說(shuō)明:以下分類(lèi)并不是一個(gè)應(yīng)用只能使用一個(gè)分類(lèi)瞧省,可以根據(jù)場(chǎng)景來(lái)切換不同的分類(lèi)。
主場(chǎng)景分類(lèi)鳍贾;
Category iOS下目前有七種鞍匾,每種Category都對(duì)應(yīng)是否支持下面四種能力
Interrupts non-mixable apps audio:是否打斷不支持混音播放的APP
Silenced by the Silent switch:是否會(huì)響應(yīng)手機(jī)靜音鍵開(kāi)關(guān)
Supports audio input:是否支持音頻錄制
Supports audio output:是否支持音頻播放
主場(chǎng)景Category | 描述 | 可與其他app共享混合播放 | 是否可播放/錄音 | 是否會(huì)被靜音鍵或鎖屏鍵靜音 | 是否可在后臺(tái)運(yùn)行 |
---|---|---|---|---|---|
AVAudioSessionCategoryAmbient | 背景聲音,用于以非語(yǔ)音為主的應(yīng)用骑科。 | 可混合 | 只支持播放 | 會(huì)靜音 | 不可運(yùn)行 |
AVAudioSessionCategorySoloAmbient | 默認(rèn)category | 不可混合 | 只支持播放 | 會(huì)靜音 | 不可運(yùn)行 |
AVAudioSessionCategoryPlayback | 用于播放音樂(lè)橡淑,用于以語(yǔ)音為主的應(yīng)用 | 不可混合 | 只支持播放 | 不會(huì)靜音 | 可運(yùn)行(另說(shuō)明) |
AVAudioSessionCategoryRecord | 用于錄音,除了來(lái)電鈴聲咆爽、鬧鐘梁棠、日歷提醒等系統(tǒng)聲音外其他聲音都不會(huì)被播放,只執(zhí)行錄音 | 不可混合 | 只支持錄音 | 不會(huì)靜音(鎖屏仍可錄制) | 可運(yùn)行 |
AVAudioSessionCategoryPlayAndRecord | 用于播放和錄音同時(shí)存在時(shí)斗埂,只有它允許修改默許音頻播放設(shè)備:聽(tīng)筒還是外放符糊,在該Category下聲音的默認(rèn)出口為聽(tīng)筒或者耳機(jī)。 | 默認(rèn)不引起 | 支持播放呛凶,支持錄制 | 不會(huì)靜音 | 可運(yùn)行 |
AVAudioSessionCategoryMultiRoute | 多種輸入輸出男娄,例如可以耳機(jī)、USB設(shè)備同時(shí)播放 | 不可混合 | 支持播放漾稀,支持錄制 | 不會(huì)靜音 | 可運(yùn)行 |
AVAudioSessionCategoryAudioProcessing | 硬件解碼音頻 | 不可混合 | 不支持播放沪伙,不支持錄制 | 不會(huì)靜音 | 不可運(yùn)行,可請(qǐng)求更多時(shí)間完成處理 |
AVAudioSessionCategoryAmbient : 此類(lèi)別適用于‘伴奏模式’應(yīng)用县好,只支持音頻播放。例如用戶(hù)在使用音樂(lè)應(yīng)用播放時(shí)播放的伴奏暖混。比如玩游戲的時(shí)候還想聽(tīng)QQ音樂(lè)的歌缕贡,那么把游戲播放背景音就設(shè)置成這種類(lèi)別。當(dāng)使用該類(lèi)別時(shí)拣播,來(lái)自其他應(yīng)用程序的音頻會(huì)與當(dāng)前的音頻混合晾咪。這個(gè) Category,音頻會(huì)被靜音鍵和鎖屏鍵靜音贮配。并且不會(huì)打斷其他應(yīng)用的音頻播放。這種類(lèi)別基本使用所有App的背景場(chǎng)景。
AVAudioSessionCategorySoloAmbient : 系統(tǒng)默認(rèn)會(huì)話(huà)Category, 只支持音頻播放季俩。默認(rèn)情況下,使用該類(lèi)別意味著 應(yīng)用程序的音頻不可混合宴猾,激活應(yīng)用中的會(huì)話(huà)將打斷其他應(yīng)用的音頻播放。如允許混合叼旋,則改用 AVAudioSessionCategoryAmbient仇哆。音頻會(huì)被靜音鍵和鎖屏鍵靜音。
AVAudioSessionCategoryPlayback :只支持音頻播放夫植。靜音開(kāi)關(guān)或者鎖屏不會(huì)音響音頻的播放讹剔。默認(rèn)情況下,使用此類(lèi)別意味著详民,應(yīng)用的音頻不可混合延欠,激活音頻會(huì)話(huà)將中斷其它不可混合的音頻會(huì)話(huà)。適用于音頻是主要功能的APP沈跨,像網(wǎng)易云這些音樂(lè)app由捎,鎖屏后依然可以播放。
需要注意一下谒出,選擇支持在靜音鍵切到靜音狀態(tài)以及鎖屏鍵切到鎖屏狀態(tài)下仍然可以播放音頻 Category 時(shí)隅俘,必須在應(yīng)用中開(kāi)啟支持后臺(tái)音頻功能,詳見(jiàn) UIBackgroundModes笤喳。
AVAudioSessionCategoryRecord :錄制音頻的Category为居,只支持音頻錄制,不支持播放杀狡。只要該會(huì)話(huà)處于活動(dòng)狀態(tài)蒙畴,此類(lèi)別會(huì)使系統(tǒng)上的所有輸出停止,比如微信語(yǔ)音的錄制呜象,就要用到這個(gè)類(lèi)別膳凝。除非需要防止播放其它的聲音,否則建議使用 AVAudioSessionCategoryPlayAndRecord恭陡。
用戶(hù)必須授權(quán)音頻錄制權(quán)限(iPhone 麥克風(fēng)權(quán)限)蹬音。
此類(lèi)別會(huì)話(huà)會(huì)被 電話(huà)呼叫、鬧鐘或者其它非混音音頻會(huì)話(huà)中斷
AVAudioSessionCategoryPlayAndRecord : 支持音頻播放和錄制的Category休玩,用于語(yǔ)音聊天應(yīng)用著淆,例如VoIP(互聯(lián)網(wǎng)語(yǔ)音協(xié)議)、打電話(huà) 應(yīng)用程序(如微信)拴疤。音頻的輸入和輸出不需要同步進(jìn)行永部,也可以同步進(jìn)行。
靜音鍵開(kāi)啟和鎖屏都不會(huì)影響音頻繼續(xù)播放呐矾。如要在應(yīng)用程序轉(zhuǎn)換到后臺(tái)時(shí)繼續(xù)播放(鎖屏情況下)在xcode中設(shè)置 UIBackgroundModes 即可苔埋。此類(lèi)別適用于同時(shí)錄制和播放(語(yǔ)音連麥),也適用于錄音/播放(IM語(yǔ)音條)蜒犯。 但不能同時(shí)播放组橄。默認(rèn)情況下荞膘,使用此類(lèi)別意味著應(yīng)用程序的音頻不可混合。激活會(huì)話(huà)將終端任何其他音頻會(huì)話(huà)也是不可混合的晨炕。要允許為此類(lèi)別混音衫画,請(qǐng)使用AVAudioSessionCategoryOptionMixWithOthers選項(xiàng)
只有它允許修改默許音頻播放設(shè)備:聽(tīng)筒還是外放,在該Category下聲音的默認(rèn)出口為聽(tīng)筒或者耳機(jī)瓮栗。
用戶(hù)必須授權(quán)音頻錄制權(quán)限(iPhone 麥克風(fēng)權(quán)限)
此類(lèi)別支持Airplay的鏡像版本削罩。但是,如果AVAudioSessionModeVoiceChat模式與此類(lèi)別一起使用费奸,則AirPlay鏡像將被禁用弥激。
AVAudioSessionCategoryAudioProcessing,主要用于音頻格式處理愿阐,硬件解碼音頻微服,不支持播放和錄制,一般可以配合AudioUnit進(jìn)行使用缨历。例如以蕴,在執(zhí)行離線(xiàn)音頻格式轉(zhuǎn)換時(shí)。此類(lèi)別禁用播放(音頻輸出)和禁用錄音(音頻輸入)辛孵。當(dāng)您的應(yīng)用處于后臺(tái)時(shí)丛肮,音頻處理通常不會(huì)繼續(xù)。 但是魄缚,當(dāng)您的應(yīng)用移至后臺(tái)時(shí)宝与,您可以請(qǐng)求更多時(shí)間來(lái)完成處理。
AVAudioSessionCategoryMultiRoute : 用于將不同音頻數(shù)據(jù)流同時(shí)路由到不同輸出設(shè)備的Category冶匹。此類(lèi)別支持音頻播放和錄制习劫,允許多條音頻流的同步輸入和輸出。 例如嚼隘,比如USB連接外部揚(yáng)聲器輸出音頻诽里,藍(lán)牙耳機(jī)同時(shí)播放另一路音頻這種特殊需求。 使用這個(gè)類(lèi)別需要對(duì)可用音頻路由的功能有更詳細(xì)的了解飞蛹,并與之互動(dòng)须肆。
路由更改可能會(huì)使部分或全部多路由配置失效。 使用AVAudioSessionCategoryMultiRoute類(lèi)別時(shí)桩皿,必須注冊(cè)以觀(guān)察AVAudioSessionRouteChangeNotification通知并根據(jù)需要更新配置。 這個(gè)類(lèi)別可以支持多個(gè)設(shè)備輸入輸出幢炸。
說(shuō)明:當(dāng)使用AVAudioSessionCategoryPlayback泄隔、AVAudioSessionCategoryRecord分類(lèi)時(shí),要想實(shí)現(xiàn)后臺(tái)播放宛徊,需要在Info.plist文件里添加Required background modes的數(shù)組佛嬉,在下面添加名為App plays audio or streams audio/video using AirPlay的字符串逻澳。
主場(chǎng)景細(xì)節(jié)options、modes設(shè)置
上面介紹了Category七種主場(chǎng)景暖呕,實(shí)際開(kāi)發(fā)需求中有時(shí)候需要對(duì)Category進(jìn)行微調(diào)整斜做,這就需要設(shè)置兩個(gè)參數(shù)Mode和Options。通常在激活會(huì)話(huà)之前設(shè)置類(lèi)別和模式湾揽。但也可在會(huì)話(huà)處于活躍狀態(tài)時(shí)設(shè)置類(lèi)別模式瓤逼,但這會(huì)導(dǎo)致立即更改。
建議使用setCategory:mode:options:error:method同時(shí)設(shè)置它們库物,而不是單獨(dú)設(shè)置類(lèi)別和模式屬性霸旗。(根據(jù)APP 兼容版本不同,使用不同的方法)
AVAudioSession Mode
通過(guò)上面的七大類(lèi)別戚揭,我們基本覆蓋了常用的主場(chǎng)景诱告,在每個(gè)主場(chǎng)景中可以通過(guò)Option進(jìn)行微調(diào)。為此CoreAudio提供了七大比較常見(jiàn)微調(diào)后的子場(chǎng)景民晒。叫做各個(gè)類(lèi)別的模式精居。
模式 | 兼容的 Category | 場(chǎng)景 |
---|---|---|
AVAudioSessionModeDefault | All | 默認(rèn)模式 |
AVAudioSessionModeVoiceChat | AVAudioSessionCategoryPlayAndRecord | 雙向語(yǔ)音通信 VoIP |
AVAudioSessionModeVideoChat | AVAudioSessionCategoryPlayAndRecord | 在線(xiàn)視頻會(huì)議,視頻通話(huà) |
AVAudioSessionModeGameChat | AVAudioSessionCategoryPlayAndRecord | Game Kit的語(yǔ)音聊天服務(wù)潜必,GKVoiceChat自動(dòng)設(shè)置靴姿,適用于游戲App的采集和播放 |
AVAudioSessionModeVideoRecording | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord | 錄制視頻 |
AVAudioSessionModeMoviePlayback | AVAudioSessionCategoryPlayback | 視頻播放。如果應(yīng)用正在播放電影內(nèi)容刮便,請(qǐng)指定此模式 |
AVAudioSessionModeMeasurement | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback | 最小系統(tǒng) |
下面逐一介紹下每個(gè)Mode
AVAudioSessionModeDefault空猜,默認(rèn)模式,與所有的 Category 兼容
AVAudioSessionModeVoiceChat,主要用于執(zhí)行雙向語(yǔ)音通信VoIP場(chǎng)景恨旱。只能是 AVAudioSessionCategoryPlayAndRecord Category下辈毯。在這個(gè)模式系統(tǒng)會(huì)自動(dòng)配置AVAudioSessionCategoryOptionAllowBluetooth 這個(gè)選項(xiàng)。系統(tǒng)會(huì)自動(dòng)選擇最佳的內(nèi)置麥克風(fēng)組合支持語(yǔ)音聊天搜贤,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集谆沃。使用此模式時(shí),該設(shè)備的音調(diào)君合針對(duì)語(yǔ)音進(jìn)行了優(yōu)化仪芒,并且允許路線(xiàn)組僅縮小為適用于語(yǔ)音聊天的路線(xiàn)唁影。如果應(yīng)用程序未將其模式設(shè)置為其中一個(gè)聊天模式(語(yǔ)音,視頻或游戲)掂名,則AVAudioSessionModeVoiceChat模式將被隱式設(shè)置据沈。另一方面,如果應(yīng)用程序先前已將其類(lèi)別設(shè)置為AVAudioSessionCategoryPlayAndRecord并將其模式設(shè)置為AVAudioSessionModeVideoChat或AVAudioSessionModeGameChat饺蔑,則實(shí)例化語(yǔ)音處理I / O音頻單元不會(huì)導(dǎo)致模式發(fā)生更改锌介。
AVAudioSessionModeVideoChat,主要用于視頻聊天、在線(xiàn)視頻會(huì)議類(lèi)型應(yīng)用孔祸,比如QQ視頻隆敢、FaceTime。只能是 AVAudioSessionCategoryPlayAndRecord Category下崔慧。適在這個(gè)模式系統(tǒng)會(huì)自動(dòng)配置 AVAudioSessionCategoryOptionAllowBluetooth 和 AVAudioSessionCategoryOptionDefaultToSpeaker 選項(xiàng)拂蝎。系統(tǒng)會(huì)自動(dòng)選擇最佳的內(nèi)置麥克風(fēng)組合支持視頻聊天。使用此模式時(shí)惶室,設(shè)備的音調(diào)均衡針對(duì)語(yǔ)音進(jìn)行了優(yōu)化温自,并且允許音頻路由組僅縮減為適合視頻聊天的設(shè)置。比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集并且會(huì)設(shè)置類(lèi)別的選項(xiàng)為"AVAudioSessionCategoryOptionAllowBluetooth" 和 "AVAudioSessionCategoryOptionDefaultToSpeaker"拇涤。
AVAudioSessionModeGameChat捣作,該模式由Game Kit代表使用Game Kit的語(yǔ)音聊天服務(wù)的應(yīng)用程序設(shè)置,適用于游戲App的采集和播放鹅士。使用 GKVoiceChat 對(duì)象的應(yīng)用會(huì)自動(dòng)設(shè)置這個(gè)模式和 AVAudioSessionCategoryPlayAndRecord Category券躁。實(shí)際參數(shù)和AVAudioSessionModeVideoChat一致。不要直接設(shè)置此模式掉盅。 如果需要類(lèi)似的行為并且未使用GKVoiceChat對(duì)象也拜,請(qǐng)改為使用AVAudioSessionModeVoiceChat或AVAudioSessionModeVideoChat。
AVAudioSessionModeVideoRecording趾痘,適用于使用攝像頭采集視頻錄制的應(yīng)用慢哈。只能是 AVAudioSessionCategoryPlayAndRecord 和 AVAudioSessionCategoryRecord 這兩個(gè) Category下。在具有多個(gè)內(nèi)置麥克風(fēng)的設(shè)備上永票,使用距攝像頭最近的麥克風(fēng)卵贱。此模式會(huì)導(dǎo)致系統(tǒng)提供適當(dāng)?shù)囊纛l信號(hào)處理。這個(gè)模式搭配 AVCaptureSession API 結(jié)合來(lái)用可以更好地控制音視頻的輸入輸出路徑侣集。例如键俱,設(shè)置 automaticallyConfiguresApplicationAudioSession 屬性,系統(tǒng)會(huì)自動(dòng)選擇最佳輸出路徑世分。(設(shè)置自動(dòng)配置應(yīng)用音頻會(huì)話(huà)屬性會(huì)根據(jù)使用的設(shè)備和攝像機(jī)自動(dòng)選擇最佳輸入路由编振。)
AVAudioSessionModeMeasurement,最小化系統(tǒng)臭埋。如果應(yīng)用正在執(zhí)行音頻輸入或輸出的測(cè)試踪央。此模式適用于需要將輸入和輸出信號(hào)的系統(tǒng)提供的信號(hào)處理量將至最低的應(yīng)用程序。如果在具有多個(gè)內(nèi)置麥克風(fēng)的設(shè)備上錄制瓢阴,則使用主麥克風(fēng)畅蹂。只用于 AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord荣恐、AVAudioSessionCategoryPlayback 這幾種 Category魁莉。
AVAudioSessionModeMoviePlayback,適用于播放視頻的應(yīng)用。只用于 AVAudioSessionCategoryPlayback 這個(gè)Category旗唁。使用此模式時(shí),將采用信號(hào)處理來(lái)增強(qiáng)某些音頻路由(如內(nèi)置揚(yáng)聲器或耳機(jī))的電影播放痹束。系統(tǒng)也會(huì)選擇最佳的輸入設(shè)備检疫,比如插上耳機(jī)就使用耳機(jī)上的麥克風(fēng)進(jìn)行采集
AVAudioSessionModeSpokenAudio : 用于播放語(yǔ)音并暫停其他語(yǔ)音app。當(dāng)想要在另一個(gè)應(yīng)用播放短語(yǔ)音頻時(shí)暫停當(dāng)前音頻時(shí)祷嘶,用于持續(xù)說(shuō)話(huà)音頻的模式屎媳。在iOS 8和更低版本以及iOS 9中,如果不設(shè)置此模式论巍,偶爾從導(dǎo)航和應(yīng)用程序中聽(tīng)到的語(yǔ)音與音頻混合在一起烛谊,或造成兩種音頻的混淆。 此模式通過(guò)為中斷應(yīng)用程序使用AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers音頻會(huì)話(huà)類(lèi)別選項(xiàng)來(lái)避免此問(wèn)題嘉汰。 中斷應(yīng)用程序的音頻結(jié)束后丹禀,可以恢復(fù)中斷的語(yǔ)音。
可以在設(shè)置Category之后再設(shè)置模式鞋怀。
當(dāng)然双泪,這些模式只是CoreAduio總結(jié)的,不一定完全滿(mǎn)足要求密似,對(duì)于具體的模式焙矛,在iOS10中還是可以微調(diào)的。通過(guò)接口:
(BOOL)setCategory:(NSString *)category mode:(NSString *)mode options:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
但是在iOS9及以下就只能在Category上調(diào)了残腌,其實(shí)本質(zhì)是一樣的村斟,可以認(rèn)為是個(gè)API接口封裝。
AVAudioSession Options
在設(shè)置完類(lèi)別后抛猫,可以通過(guò)
@property(readonly) AVAudioSessionCategoryOptions categoryOptions;
屬性蟆盹,查看當(dāng)前類(lèi)別設(shè)置了哪些選項(xiàng),注意這里的返回值是AVAudioSessionCategoryOptions邑滨,實(shí)際是多個(gè)options的“|”運(yùn)算日缨。默認(rèn)情況下是0。
可以使用options去微調(diào)Category行為掖看,如下表
Option | Option功能說(shuō)明 | 兼容的 Category |
---|---|---|
AVAudioSessionCategoryOptionMixWithOthers | 支持和其他APP音頻混合 | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionDuckOthers | 系統(tǒng)智能調(diào)低其他APP音頻音量匣距,突出本app的音量(導(dǎo)航地圖) | AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionAllowBluetooth | 支持藍(lán)牙音頻輸入 | AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionDefaultToSpeaker | 設(shè)置默認(rèn)輸出音頻到揚(yáng)聲器,即免提 | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionInterrupt SpokenAudioAndMixWithOthers | app偶爾的使用音頻播放 | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryMultiRoute |
AVAudioSessionCategoryOptionAllowBluetoothA2DP | 立體聲藍(lán)牙 | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionAllowAirPlay | 遠(yuǎn)程AirPlay設(shè)備 | AVAudioSessionCategoryPlayAndRecord |
AVAudioSessionCategoryOptionMixWithOthers :確定來(lái)自此會(huì)話(huà)的音頻是否與來(lái)自其他音頻應(yīng)用中活動(dòng)會(huì)話(huà)的音頻混合哎壳。當(dāng)一個(gè)app即包含audio輸入又包含輸出的時(shí)候毅待,設(shè)置這個(gè)選項(xiàng)在激活會(huì)話(huà)時(shí)不會(huì)打斷其他應(yīng)用程序的音頻播放 。
如果會(huì)話(huà)類(lèi)別是AVAudioSessionCategoryAmbient归榕,則此選項(xiàng)會(huì)自動(dòng)設(shè)置尸红。如果設(shè)置了AVAudioSessionCategoryOptionDuckOthers或AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers選項(xiàng),則會(huì)自動(dòng)設(shè)置此選項(xiàng)。如果清除此選項(xiàng)外里,激活會(huì)話(huà)會(huì)中斷其他音頻會(huì)話(huà)怎爵。 如果設(shè)置了此選項(xiàng),則應(yīng)用程序的音頻會(huì)與后臺(tái)應(yīng)用程序中的音頻(如音樂(lè)應(yīng)用程序)混合在一起盅蝗。
例如:AVAudioSessionCategoryPlayback實(shí)現(xiàn)的一個(gè)背景音鳖链,但是呢,又想和QQ音樂(lè)并存墩莫,那么可以在A(yíng)VAudioSessionCategoryPlayback類(lèi)別下再設(shè)置這個(gè)選項(xiàng)芙委,就可以實(shí)現(xiàn)共存了。
AVAudioSessionCategoryOptionDuckOthers : 激活會(huì)話(huà)時(shí)降低其他程序的音頻播放聲音(音量降低) 狂秦,主要是體現(xiàn)當(dāng)前音頻的重要性灌侣,此時(shí)就是通過(guò)設(shè)置這個(gè)選項(xiàng)來(lái)對(duì)其他音樂(lè)App進(jìn)行了壓制。比如說(shuō)開(kāi)車(chē)聽(tīng)歌的時(shí)候裂问,導(dǎo)航的聲音就屬于比較重要的或者是需要特別關(guān)注的就可以是用這個(gè)選項(xiàng) 侧啼。會(huì)影響其他應(yīng)用,不用時(shí)需要deactivate audio session
設(shè)置此標(biāo)志隱式設(shè)置AVAudioSessionCategoryOptionMixWithOthers標(biāo)志愕秫。如果清除此選項(xiàng)慨菱,激活會(huì)話(huà)會(huì)中斷其他音頻會(huì)話(huà)。如果設(shè)置了此選項(xiàng)戴甩,則應(yīng)用程序的音頻會(huì)與后臺(tái)應(yīng)用程序中的音頻(如音樂(lè)應(yīng)用程序)混合在一起符喝。與當(dāng)前應(yīng)用混合時(shí),來(lái)自其他應(yīng)用的音頻會(huì)減少音量甜孤。如果您希望通過(guò)音樂(lè)或其他當(dāng)前正在播放的音頻聽(tīng)到您應(yīng)用中的音頻(例如协饲,導(dǎo)航應(yīng)用中的語(yǔ)音提示),請(qǐng)?jiān)O(shè)置此選項(xiàng)缴川。如果您的應(yīng)用程序提供了偶爾的口語(yǔ)音頻茉稠,例如在轉(zhuǎn)彎的導(dǎo)航應(yīng)用程序或練習(xí)應(yīng)用程序中,則還應(yīng)該設(shè)置AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers選項(xiàng)把夸。
AVAudioSessionCategoryOptionAllowBluetooth : 藍(lán)牙免提設(shè)備是否顯示為可用輸入路由。如果要支持藍(lán)牙耳機(jī)電話(huà)恋日,則需要設(shè)置這個(gè)選項(xiàng)膀篮。
需要設(shè)置此選項(xiàng)才能將音頻輸入和輸出路由到配對(duì)的藍(lán)牙免提模式(HFP)設(shè)備跟啤。 如果清除此選項(xiàng)唉锌,則配對(duì)的藍(lán)牙HFP不會(huì)顯示為可用的音頻輸入路由。
如果應(yīng)用程序使用setPreferredInput:error:方法選擇藍(lán)牙HFP輸入竿奏,則輸出將自動(dòng)更改為相應(yīng)的藍(lán)牙HFP輸出袄简。 同樣,使用MPVolumeView對(duì)象的路由選擇器選擇藍(lán)牙HFP輸出泛啸,會(huì)自動(dòng)將輸入更改為相應(yīng)的藍(lán)牙HFP輸入绿语。 因此,即使僅選擇了輸入或輸出候址,音頻輸入和輸出也將始終路由至Bluetooth HFP設(shè)備吕粹。
只有音頻會(huì)話(huà)類(lèi)別為AVAudioSessionCategoryPlayAndRecord或AVAudioSessionCategoryRecord時(shí),才能設(shè)置此選項(xiàng)岗仑。
AVAudioSessionCategoryOptionDefaultToSpeaker :在沒(méi)有其他通道的時(shí)候默認(rèn)選擇內(nèi)置揚(yáng)聲器而不是接收器匹耕。如果在VoIP模式下,希望默認(rèn)打開(kāi)免提功能荠雕,需要設(shè)置這個(gè)選項(xiàng)稳其。此選項(xiàng)只能在使用AVAudioSessionCategoryPlayAndRecord類(lèi)別時(shí)設(shè)置。 它用于修改類(lèi)別的路由行為炸卑,以便在沒(méi)有使用其他配件(如耳機(jī))的情況下既鞠,音頻始終會(huì)路由至揚(yáng)聲器而不是接收器。 例如盖文,插入頭戴式耳機(jī)將導(dǎo)致路由變?yōu)轭^戴式耳機(jī)麥克風(fēng)/耳機(jī)嘱蛋,并且拔下頭戴式耳機(jī)將導(dǎo)致路由更換為內(nèi)置麥克風(fēng)/揚(yáng)聲器(與內(nèi)置麥克風(fēng)/接收器相反) 已設(shè)置。
如果使用USB輸入專(zhuān)用附件五续,音頻輸入將來(lái)自附件洒敏,如果沒(méi)有插入耳機(jī),則輸出將路由到耳機(jī)(如果連接)或揚(yáng)聲器返帕。
AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers :播放此應(yīng)用的音頻內(nèi)容時(shí)桐玻,是否暫停來(lái)自其他應(yīng)用的連續(xù)語(yǔ)音內(nèi)容。
設(shè)置此選項(xiàng)還會(huì)設(shè)置AVAudioSessionCategoryOptionMixWithOthers荆萤。
如果清除此選項(xiàng)镊靴,音頻會(huì)話(huà)中的音頻會(huì)中斷其他會(huì)話(huà)铣卡。
如果設(shè)置了此選項(xiàng),則您的音頻會(huì)與其他音頻會(huì)話(huà)混合使用偏竟,但會(huì)中斷(并停止)使用AVAudioSessionModeSpokenAudio音頻會(huì)話(huà)模式的音頻會(huì)話(huà)煮落。只要會(huì)話(huà)處于活動(dòng)狀態(tài),其他應(yīng)用程序的音頻就會(huì)暫停踊谋。音頻會(huì)話(huà)停用后蝉仇,中斷的應(yīng)用程序的音頻恢復(fù)。
如果突然播放一段語(yǔ)音殖蚕,例如導(dǎo)航應(yīng)用轿衔,使用此選項(xiàng)。這可以避免兩個(gè)口語(yǔ)音頻應(yīng)用程序混合時(shí)出現(xiàn)干擾問(wèn)題睦疫。除非有特殊的原因害驹,否則建議設(shè)置為AVAudioSessionCategoryOptionDuckOthers選項(xiàng)。當(dāng)其他音頻不是說(shuō)音頻時(shí)蛤育,避免其他音頻而不是中斷它宛官。
AVAudioSessionCategoryOptionAllowBluetoothA2DP : 立體聲藍(lán)牙。
高級(jí)音頻分布配置文件(A2DP)是一種立體聲瓦糕,僅輸出配置文件底洗,適用于較高帶寬音頻使用情況,如音樂(lè)播放咕娄。如果應(yīng)用程序的音頻會(huì)話(huà)配置為使用AVAudioSessionCategoryAmbient亥揖,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback類(lèi)別,系統(tǒng)將自動(dòng)路由至A2DP端口谭胚。
從iOS 10.0開(kāi)始徐块,使用AVAudioSessionCategoryPlayAndRecord類(lèi)別的應(yīng)用程序還可以允許將輸出路由到配對(duì)的藍(lán)牙A2DP設(shè)備。要啟用此行為灾而,您需要在設(shè)置音頻會(huì)話(huà)的類(lèi)別時(shí)傳遞此類(lèi)別選項(xiàng)胡控。使用AVAudioSessionCategoryMultiRoute或AVAudioSessionCategoryRecord類(lèi)別的音頻會(huì)話(huà)隱式清除此選項(xiàng)。
如果清除此選項(xiàng)旁趟,則配對(duì)的藍(lán)牙A2DP設(shè)備不會(huì)顯示為可用的音頻輸出路由昼激。
如果此選項(xiàng)和AVAudioSessionCategoryOptionAllowBluetooth選項(xiàng)均已設(shè)置,則當(dāng)單個(gè)設(shè)備同時(shí)支持免提配置文件(HFP)和高級(jí)音頻分布配置文件(A2DP)時(shí)锡搜,免提端口將獲得更高的路由優(yōu)先級(jí)橙困。
AVAudioSessionCategoryOptionAllowAirPlay : 遠(yuǎn)程AirPlay設(shè)備。
只有在音頻會(huì)話(huà)類(lèi)別為AVAudioSessionCategoryPlayAndRecord時(shí)耕餐,才能顯式設(shè)置此選項(xiàng)凡傅。 對(duì)于大多數(shù)其他音頻會(huì)話(huà)類(lèi)別,此選項(xiàng)是隱式設(shè)置的肠缔。 使用AVAudioSessionCategoryMultiRoute或AVAudioSessionCategoryRecord類(lèi)別的音頻會(huì)話(huà)隱式清除此選項(xiàng)夏跷。
如果清除此選項(xiàng)哼转,則AirPlay設(shè)備不會(huì)顯示為可用的音頻輸出路線(xiàn)。
如果設(shè)置了此選項(xiàng)槽华,這些設(shè)備將顯示為可用的輸出路徑壹蔓。
通過(guò)Category和合適的Mode和Options的搭配我們可以調(diào)優(yōu)出我們的效果,下面舉兩個(gè)應(yīng)用場(chǎng)景:
用過(guò)高德地圖的都知道猫态,在后臺(tái)播放QQ音樂(lè)的時(shí)候佣蓉,如果導(dǎo)航語(yǔ)音出來(lái),QQ音樂(lè)不會(huì)停止亲雪,而是被智能壓低和混音勇凭,等導(dǎo)航語(yǔ)音播報(bào)完后,QQ音樂(lè)正常播放义辕,這里我們需要后臺(tái)播放音樂(lè)套像,所以Category使用AVAudioSessionCategoryPlayback,需要混音和智能壓低其他APP音量终息,所以O(shè)ptions選用 AVAudioSessionCategoryOptionMixWithOthers和AVAudioSessionCategoryOptionDuckOthers
代碼示例如下
BOOL isSuccess = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError];
又或者我希望AVAudioSessionCategoryPlayAndRecord這個(gè)Category默認(rèn)的音頻由揚(yáng)聲器播放,那么可以調(diào)用這個(gè)接口去調(diào)整Category
- (BOOL)setCategory:(NSString *)category withOptions:(AVAudioSessionCategoryOptions)options error:(NSError **)outError
通過(guò)選擇合適和Category贞让,mode和options周崭,就可以調(diào)優(yōu)音頻的輸入輸出,來(lái)滿(mǎn)足日常開(kāi)發(fā)需求(需要注意的是Category喳张,mode续镇,option是搭配使用的,而不是簡(jiǎn)單組合销部,也就是說(shuō)某種Category支持某些mode和option摸航,從上面的表中也可以看出這一點(diǎn))
音頻中斷處理
AVAudioSession提供了多種Notifications來(lái)進(jìn)行此類(lèi)狀況的通知。其中將來(lái)電話(huà)舅桩、鬧鈴響等都?xì)w結(jié)為一般性的中斷酱虎,用AVAudioSessionInterruptionNotification來(lái)通知。
我們可以通過(guò)監(jiān)聽(tīng)AVAudioSessionInterruptionNotification這個(gè)key獲取音頻中斷事件
回調(diào)回來(lái)Userinfo有鍵值
AVAudioSessionInterruptionTypeKey:
取值A(chǔ)VAudioSessionInterruptionTypeBegan表示中斷開(kāi)始擂涛,我們應(yīng)該暫停播放和采集读串。
取值A(chǔ)VAudioSessionInterruptionTypeEnded表示中斷結(jié)束,我們可以繼續(xù)播放和采集撒妈。
AVAudioSessionInterruptionOptionKey: 當(dāng)前只有一種值A(chǔ)VAudioSessionInterruptionOptionShouldResume表示此時(shí)也應(yīng)該恢復(fù)繼續(xù)播放和采集恢暖。
中斷開(kāi)始:我們需要做的是保存好播放狀態(tài),上下文狰右,更新用戶(hù)界面等
中斷結(jié)束:我們要做的是恢復(fù)好狀態(tài)和上下文杰捂,更新用戶(hù)界面,根據(jù)需求準(zhǔn)備好之后選擇是否激活我們session棋蚌。
而將其他App占據(jù)AudioSession的時(shí)候用AVAudioSessionSilenceSecondaryAudioHintNotification來(lái)進(jìn)行通知嫁佳。其回調(diào)回來(lái)的userInfo鍵為:
AVAudioSessionSilenceSecondaryAudioHintTypeKey
可能包含的值:
AVAudioSessionSilenceSecondaryAudioHintTypeBegin: 表示其他App開(kāi)始占據(jù)Session
AVAudioSessionSilenceSecondaryAudioHintTypeEnd: 表示其他App開(kāi)始釋放Session
選擇不同的音頻播放技術(shù)挨队,處理中斷方式也有差別,具體如下:
System Sound Services:使用 System Sound Services 播發(fā)音頻脱拼,系統(tǒng)會(huì)自動(dòng)處理瞒瘸,不受APP控制,當(dāng)中斷發(fā)生時(shí)熄浓,音頻播放會(huì)靜音情臭,當(dāng)中斷結(jié)束后,音頻播放會(huì)恢復(fù)赌蔑。
AV Foundation framework:AVAudioPlayer 類(lèi)和 AVAudioRecorder 類(lèi)提供了中斷開(kāi)始和結(jié)束的 Delegate 回調(diào)方法來(lái)處理中斷俯在。中斷發(fā)生,系統(tǒng)會(huì)自動(dòng)停止播放娃惯,需要做的是記錄播放時(shí)間等狀態(tài)跷乐,更新用戶(hù)界面,等中斷結(jié)束后趾浅,再次調(diào)用播放方法愕提,系統(tǒng)會(huì)自動(dòng)激活session。
Audio Queue Services, I/O audio unit:使用aduio unit這些技術(shù)需要處理中斷皿哨,需要做的是記錄播放或者錄制的位置浅侨,中斷結(jié)束后自己恢復(fù)audio session。
OpenAL:使用 OpenAL 播放時(shí)证膨,同樣需要自己監(jiān)聽(tīng)中斷如输。管理 OpenAL上下文,用戶(hù)中斷結(jié)束后恢復(fù)audio session央勒。
需要注意的是:1. 有中斷開(kāi)始事件不见,不一定對(duì)應(yīng)有中斷結(jié)束事件,所以需要在用戶(hù)進(jìn)入前臺(tái)崔步,點(diǎn)擊UI操作的時(shí)候稳吮,需要保存好播放狀態(tài)和對(duì)Audio Session管理,以便不影響APP的音頻功能井濒。2.音頻資源競(jìng)爭(zhēng)上盖高,一定是電話(huà)優(yōu)先成玫。
線(xiàn)路改變事件比如耳機(jī)拔入拔出
當(dāng)收到線(xiàn)路變換通知后较曼,在NSNotificationCenter中對(duì)AVAudioSessionRouteChangeNotification進(jìn)行注冊(cè)华蜒。在其userInfo中有鍵:AVAudioSessionRouteChangeReasonKey
取值A(chǔ)VAudioSessionRouteChangeReasonOldDeviceUnavailable時(shí)写半,表示有設(shè)備斷開(kāi)瓤湘。根據(jù)人性化原則修然,在耳機(jī)拔出時(shí)應(yīng)該使正在播放的聲音暫停蛙粘。
取值A(chǔ)VAudioSessionRouteChangeReasonNewDeviceAvailable時(shí)顶吮,表示有設(shè)備連接过牙。
AVAudioSessionRouteChangeReasonKey : 表示改變的原因
枚舉值 | 意義 |
---|---|
AVAudioSessionRouteChangeReasonUnknown | 未知原因 |
AVAudioSessionRouteChangeReasonNewDeviceAvailable | 有新設(shè)備可用 |
AVAudioSessionRouteChangeReasonOldDeviceUnavailable | 老設(shè)備不可用 |
AVAudioSessionRouteChangeReasonCategoryChange | 類(lèi)別改變了 |
AVAudioSessionRouteChangeReasonOverride | App重置了輸出設(shè)置 |
AVAudioSessionRouteChangeReasonWakeFromSleep | 從睡眠狀態(tài)呼醒 |
AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory | 當(dāng)前Category下沒(méi)有合適的設(shè)備 |
Audio Session Error Codes
由AVAudioSession方法返回的NSError對(duì)象中使用的錯(cuò)誤代碼甥厦。
AVAudioSessionErrorCodeNone
操作成功纺铭。
AVAudioSessionErrorCodeMediaServicesFailed
嘗試在媒體服務(wù)失敗期間或之后使用音頻會(huì)話(huà)。
AVAudioSessionErrorCodeIsBusy
嘗試將其音頻會(huì)話(huà)設(shè)置為非活動(dòng)狀態(tài)刀疙,但仍在播放和/或錄制舶赔。
AVAudioSessionErrorCodeIncompatibleCategory
試圖執(zhí)行當(dāng)前類(lèi)別中不允許的操作。
AVAudioSessionErrorCodeCannotInterruptOthers
嘗試在應(yīng)用程序處于后臺(tái)時(shí)使不可混音的音頻會(huì)話(huà)處于活動(dòng)狀態(tài)谦秧。
AVAudioSessionErrorCodeMissingEntitlement
試圖執(zhí)行應(yīng)用程序沒(méi)有所需權(quán)利的操作竟纳。
AVAudioSessionErrorCodeSiriIsRecording
Siri正在錄制時(shí)嘗試執(zhí)行不允許的操作。
AVAudioSessionErrorCodeCannotStartPlaying
試圖開(kāi)始音頻播放疚鲤,但不允許播放锥累。
AVAudioSessionErrorCodeCannotStartRecording
試圖開(kāi)始錄音,但失敗了集歇。
AVAudioSessionErrorCodeBadParam
試圖將屬性設(shè)置為非法值桶略。
AVAudioSessionErrorInsufficientPriority
該應(yīng)用程序不允許設(shè)置音頻類(lèi)別,因?yàn)樗诒涣硪粋€(gè)應(yīng)用程序使用诲宇。
AVAudioSessionErrorCodeResourceNotAvailable
由于設(shè)備沒(méi)有足夠的硬件資源來(lái)完成操作而失敗的操作际歼。
AVAudioSessionErrorCodeUnspecified
沒(méi)有更多的錯(cuò)誤信息可用。當(dāng)音頻系統(tǒng)處于不一致?tīng)顟B(tài)時(shí)姑蓝,通常會(huì)產(chǎn)生這種錯(cuò)誤類(lèi)型蹬挺。
代碼:
AVAudioSession* session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker |
AVAudioSessionCategoryOptionDuckOthers |
AVAudioSessionCategoryOptionAllowBluetooth
error:nil];
[session setMode:AVAudioSessionModeVoiceChat error:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleRouteChange:)
name:AVAudioSessionRouteChangeNotification
object:[AVAudioSession sharedInstance]];
- (void)handleRouteChange:(NSNotification*)notification {
NSDictionary* interuptionDict = notification.userInfo;
NSInteger routeChangeReason = [[interuptionDict
valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (routeChangeReason) {
case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
ISLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
// 插入耳機(jī)時(shí)關(guān)閉揚(yáng)聲器播放
break;
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
ISLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
// 拔出耳機(jī)時(shí)的處理為開(kāi)啟揚(yáng)聲器播放
break;
case AVAudioSessionRouteChangeReasonCategoryChange:
// called at start - also when other audio wants to play
ISLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
break;
}
}
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleAudioInterrupted:)
name:AVAudioSessionInterruptionNotification
object:[AVAudioSession sharedInstance]];
- (void)handleAudioInterrupted:(NSNotification*)notification {
ISLog(@"音頻打斷通知 the notification is %@", notification);
if (!_webRtcAvailable) {
return;
}
if (AVAudioSessionInterruptionTypeBegan ==
[notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]) {
LOGE("音頻打斷開(kāi)始 begin");
} else if (AVAudioSessionInterruptionTypeEnded ==
[notification.userInfo[AVAudioSessionInterruptionTypeKey]
intValue]) {
LOGE("音頻打斷結(jié)束 begin - end");
}
}
雜記
AudioSession Route
默認(rèn)音頻輸出為揚(yáng)聲器
在PlayAndRecord這個(gè)category下,默認(rèn)音頻輸出為聽(tīng)筒它掂。
揚(yáng)聲器,聽(tīng)筒,耳機(jī),藍(lán)牙音箱之間的切換
利用MPVolumeView來(lái)讓用戶(hù)切換到揚(yáng)聲器,
通過(guò)overrideOutputAudioPort方法來(lái)切換到揚(yáng)聲器
修改category 的option為AVAudioSessionCategoryOptionDefaultToSpeaker
多個(gè)外接音頻接收設(shè)備時(shí)(耳機(jī)溯泣,藍(lán)牙音箱等)虐秋,將遵循last-in wins的原則來(lái)選擇外接設(shè)備,即聲音將被導(dǎo)向最后接入的設(shè)備垃沦。
通過(guò)AVAudioSessionPortOverride選擇音頻輸出
AVAudioSessionPortOverrideNone
不要覆蓋輸出音頻端口客给。使用此選項(xiàng)將音頻輸出設(shè)備返回到當(dāng)前音頻類(lèi)別的默認(rèn)狀態(tài)。
AVAudioSessionPortOverrideSpeaker
覆蓋當(dāng)前輸入和輸出肢簿,設(shè)置音頻輸出設(shè)備為內(nèi)置揚(yáng)聲器和麥克風(fēng)靶剑。僅適用于A(yíng)VAudioSessionCategoryPlayAndRecord類(lèi)別。
代碼例子
[audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:error];
通過(guò)AVAudioSessionCategoryOptions選擇音頻輸出設(shè)備
會(huì)話(huà)的類(lèi)別和模式一起定義應(yīng)用程序如何使用音頻池充。通常桩引,在激活會(huì)話(huà)之前設(shè)置類(lèi)別和模式。您還可以在會(huì)話(huà)處于活動(dòng)狀態(tài)時(shí)設(shè)置類(lèi)別或模式收夸,但這會(huì)導(dǎo)致立即更改音頻輸出設(shè)備坑匠。
代碼例子:
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
AVAudioSessionCategoryOptions 枚舉值:
Input
AVAudioSessionPortUSBAudio
AVAudioSessionPortHeadsetMic
AVAudioSessionPortBuiltInMic
Output
AVAudioSessionPortUSBAudio
AVAudioSessionPortLineOut
AVAudioSessionPortHeadphones
AVAudioSessionPortHDMI
AVAudioSessionPortBuiltInSpeaker
overrideOutputAudioPort:方法和AVAudioSessionPortOverride的對(duì)比
共同點(diǎn):使用僅適用于A(yíng)VAudioSessionCategoryPlayAndRecord類(lèi)別。
區(qū)別
overrideOutputAudioPort:是臨時(shí)覆蓋卧惜。任何音頻輸出改變或中斷將導(dǎo)致音頻被路由回到其正常輸出設(shè)備厘灼,遵循最后入勝的規(guī)則
AVAudioSessionCategoryOptionDefaultToSpeaker夹纫,在沒(méi)有使用耳機(jī)等其他附件時(shí),音頻將總是路由到揚(yáng)聲器而不是接收器设凹。
舉個(gè)例子
方法1, 設(shè)置之后舰讹,如果此時(shí)插入耳機(jī),在拔掉闪朱。播放的聲音會(huì)從聽(tīng)筒輸出月匣,而不是回到揚(yáng)聲器。
方法2, 設(shè)置之后监透,始終輸出到揚(yáng)聲器桶错,而不是其他接收器,如果沒(méi)有耳機(jī)胀蛮。(簡(jiǎn)要的說(shuō)院刁,就是如果有個(gè)藍(lán)牙音箱,哪怕接上都不會(huì)有聲音輸出到藍(lán)牙音響粪狼,插上耳機(jī)退腥,則會(huì)有聲音輸出到耳機(jī)。)
AVAudioSession總結(jié)
AVAudioSession的作用就是管理音頻這一唯一硬件資源的分配再榄,通過(guò)調(diào)優(yōu)合適的AVAudioSession來(lái)適配我們的APP對(duì)于音頻的功能需求狡刘。切換音頻場(chǎng)景時(shí)候,需要相應(yīng)的切換AVAudioSession困鸥。
AVAudioSession構(gòu)建了一個(gè)音頻使用生命周期的上下文嗅蔬。當(dāng)前狀態(tài)是否可以錄音、對(duì)其他App有怎樣的影響疾就、是否響應(yīng)系統(tǒng)的靜音鍵澜术、如何感知來(lái)電話(huà)了等都可以通過(guò)它來(lái)實(shí)現(xiàn)。尤為重要的是AVAudioSession不僅可以和AVFoundation中的AVAudioPlyaer/AVAudioRecorder配合猬腰,其他錄音/播放工具比如AudioUnit鸟废、AudioQueueService也都需要他進(jìn)行錄音、靜音等上下文配合姑荷。
AVAudioSessionCategoryPlayAndRecord類(lèi)別下
- (BOOL)setMode:(AVAudioSessionMode)mode error:(NSError **)outError
設(shè)置這個(gè)屬性會(huì)導(dǎo)致藍(lán)牙耳機(jī)連接失敗盒延,不去設(shè)置這個(gè)屬性藍(lán)牙耳機(jī)可以使用,一直找不到原因鼠冕,不知道是不是跟 webrtc 有關(guān)系添寺。。懈费。 后來(lái)找到一個(gè)方案畦贸,在 系統(tǒng)版本 10.0 以上設(shè)置AVAudioSessionCategoryOptionAllowBluetoothA2DP 這個(gè)Option使用藍(lán)牙耳機(jī),10.0 以下首次設(shè)置AVAudioSession不設(shè)置mode,音頻打斷時(shí)候再去設(shè)置就不會(huì)出現(xiàn)藍(lán)牙不能使用的問(wèn)題了薄坏,具體為什么還在查找中
感覺(jué)CoreAudio缺少一個(gè)setOption的接口趋厉,Category已經(jīng)設(shè)置過(guò),為何設(shè)置選項(xiàng)的時(shí)候再指定Category胶坠,這里不太理解君账。。沈善。
結(jié)合網(wǎng)上文案總結(jié)只為自己解惑加深印象。