iOS 音頻-AVAudioSession

AVAudioSession 概述

最近在做 webrtc 采集與播放音頻风秤,使用AVAudioSession進(jìn)行播放與錄音功能
蘋(píng)果的官方圖:


1320629-cfd1eacecf2cacae.png

可以看到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)用


屏幕快照 2019-05-18 下午1.59.22.png

[[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é)只為自己解惑加深印象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玖翅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猜极,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)桦卒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)方灾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裕偿,“玉大人嘿棘,你說(shuō)我怎么就攤上這事鸟妙』ㄍ郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沪曙,是天一觀(guān)的道長(zhǎng)液走。 經(jīng)常有香客問(wèn)我缘眶,道長(zhǎng)嘱根,這世上最難降的妖魔是什么巷懈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任顶燕,我火速辦了婚禮凑保,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涌攻。我一直安慰自己恳谎,他們只是感情好婚苹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布租副。 她就那樣靜靜地躺著结胀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪责循。 梳的紋絲不亂的頭發(fā)上糟港,一...
    開(kāi)封第一講書(shū)人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音院仿,去河邊找鬼秸抚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛歹垫,可吹牛的內(nèi)容都是我干的剥汤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼排惨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吭敢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起暮芭,我...
    開(kāi)封第一講書(shū)人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹿驼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辕宏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體畜晰,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年瑞筐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凄鼻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聚假,死狀恐怖块蚌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魔策,我是刑警寧澤匈子,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布河胎,位于F島的核電站闯袒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜政敢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一其徙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喷户,春花似錦唾那、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至河哑,卻和暖如春避诽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背璃谨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工沙庐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佳吞。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓拱雏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親底扳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铸抑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容