轉(zhuǎn):https://baijiahao.baidu.com/s?id=1708682753422314151&wfr=spider&for=pc
音頻輸出作為硬件資源瘟判,對于iOS系統(tǒng)來說是唯一的图谷,需要通過“AVAudioSession”這個系統(tǒng)級全局對象對各個App進行控制。
常見音頻場景
是進行錄音還是播放?
當(dāng)系統(tǒng)靜音鍵按下時該如何表現(xiàn)捐名?
是從揚聲器還是從聽筒里面播放聲音尖啡?
插拔耳機后如何表現(xiàn)婉宰?
來電話/鬧鐘響了后如何表現(xiàn)妙色?
其他音頻App啟動后如何表現(xiàn)?
通過“AVAudioSession”可以做什么操作
為app選擇輸入輸出的路由:通過揚聲器或者聽筒播放--可以手動設(shè)置通過手機上揚聲器/聽筒或者耳機播放--系統(tǒng)自動切換赵辕,插入耳機默認(rèn)耳機
為app選擇輸入的路由:通過手機麥克風(fēng)或者耳機麥克風(fēng)采集-系統(tǒng)自動切換既绩,插入耳機默認(rèn)耳機
協(xié)調(diào)音頻播放的app之間的關(guān)聯(lián),以及系統(tǒng)的聲音處理
處理被其他app打斷后的情況
錄音或者播放音樂
AVAudioSession默認(rèn)行為
可以進行播放还惠,但是不能進行錄制饲握。
當(dāng)用戶將手機上的靜音撥片撥到“靜音”狀態(tài)時,此時如果正在播放音頻,那么播放內(nèi)容會被靜音救欧。
當(dāng)用戶按了手機的鎖屏鍵或者手機自動鎖屏了衰粹,此時如果正在播放音頻,那么播放會靜音并被暫停笆怠。
如果你的App在開始播放的時候铝耻,此時QQ音樂或其他App正在播放,那么其他播放器會被靜音并暫停蹬刷。
系統(tǒng)會在app啟動的時候瓢捉,激活這個全局唯一的AVAudioSession
音頻模式七大場景
該場景由7個類別分別控制:
默認(rèn)是:CategorySoloAmbient(獨占播放)
AVAudioSessionCategoryAmbient : 只用于播放音樂時,并且可以和QQ音樂同時播放办成,比如玩游戲的時候還想聽QQ音樂的歌泡态,那么把游戲播放背景音就設(shè)置成這種類別。同時诈火,當(dāng)用戶鎖屏或者靜音時也會隨著靜音兽赁,這種類別基本適用所有App的背景場景状答。
AVAudioSessionCategorySoloAmbient: 也是只用于播放,但是和"AVAudioSessionCategoryAmbient"不同的是冷守,用了它就別想聽QQ音樂了,比如不希望QQ音樂干擾的App惊科,類似節(jié)奏大師拍摇。同樣當(dāng)用戶鎖屏或者靜音時也會隨著靜音,鎖屏了就玩不了節(jié)奏大師了馆截。
AVAudioSessionCategoryPlayback: 如果鎖屏了還想聽聲音怎么辦充活?用這個類別,比如App本身就是播放器蜡娶,同時當(dāng)App播放時混卵,其他類似QQ音樂就不能播放了。所以這種類別一般用于播放器類App
AVAudioSessionCategoryRecord: 有了播放器窖张,肯定要錄音機幕随,比如微信語音的錄制,就要用到這個類別宿接,既然要安靜的錄音赘淮,肯定不希望有QQ音樂了,所以其他播放聲音會中斷睦霎。想想微信語音的場景梢卸,就知道什么時候用他了。
AVAudioSessionCategoryPlayAndRecord: 如果既想播放又想錄制該用什么模式呢副女?比如VoIP蛤高,打電話這種場景,PlayAndRecord就是專門為這樣的場景設(shè)計的 。
AVAudioSessionCategoryMultiRoute: 想象一個DJ用的App襟齿,手機連著HDMI到揚聲器播放當(dāng)前的音樂姻锁,然后耳機里面播放下一曲,這種常人不理解的場景猜欺,這個類別可以支持多個設(shè)備輸入輸出位隶。
AVAudioSessionCategoryAudioProcessing: 主要用于音頻格式處理,一般可以配合AudioUnit進行使用
上面介紹的七大類別开皿,可以認(rèn)為是設(shè)定了七種主場景涧黄,而這七類肯定是不能滿足開發(fā)者所有的需求的。AVAudioSession提供的方法是赋荆,首先定下7種類別中的一種基調(diào)笋妥,再進行微調(diào)。AVAudioSession為每種Category都提供了些許選項來進行微調(diào)窄潭。
類別的選項
AVAudioSessionCategoryOptionMixWithOthers : 如果確實用的AVAudioSessionCategoryPlayback實現(xiàn)的一個背景音春宣,但是又想和QQ音樂并存,可以在AVAudioSessionCategoryPlayback類別下在設(shè)置這個選項嫉你,就可以實現(xiàn)共了月帝。
AVAudioSessionCategoryOptionDuckOthers:在實時通話的場景,比如QQ音樂幽污,當(dāng)進行視頻通話的時候嚷辅,會發(fā)現(xiàn)QQ音樂自動聲音降低了,此時就是通過設(shè)置這個選項來對其他音樂App進行了壓制距误。
AVAudioSessionCategoryOptionAllowBluetooth:如果要支持藍牙耳機電話簸搞,則需要設(shè)置這個選項
AVAudioSessionCategoryOptionDefaultToSpeaker: 如果在VoIP模式下,希望默認(rèn)打開免提功能准潭,需要設(shè)置這個選項
七大模式
AVAudioSessionModeDefault: 每種類別默認(rèn)的就是這個模式趁俊。
AVAudioSessionModeVoiceChat:主要用于VoIP場景,此時系統(tǒng)會選擇最佳的輸入設(shè)備刑然,比如插上耳機就使用耳機上的麥克風(fēng)進行采集寺擂。同時會設(shè)置類別的選項為"AVAudioSessionCategoryOptionAllowBluetooth"從而支持藍牙耳機。
AVAudioSessionModeVideoChat : 主要用于視頻通話闰集,比如QQ視頻沽讹、FaceTime。系統(tǒng)會選擇最佳的輸入設(shè)備武鲁,比如插上耳機就使用耳機上的麥克風(fēng)進行采集并且會設(shè)置類別的選項為"AVAudioSessionCategoryOptionAllowBluetooth" 和 "AVAudioSessionCategoryOptionDefaultToSpeaker"爽雄。
AVAudioSessionModeGameChat : 適用于游戲App的采集和播放,比如“GKVoiceChat”對象沐鼠,一般不需要手動設(shè)置
每個模式有其適用的類別挚瘟,可以根據(jù)具體需要做對應(yīng)的組合叹谁。
音頻通知
系統(tǒng)中斷通知
如果app正在視頻通話,突然來電話了乘盖、鬧鐘響了等焰檩,最常用的場景是先暫停,待恢復(fù)的時候再繼續(xù)订框。app可以通過監(jiān)聽系統(tǒng)消息:AVAudioSessionInterruptionNotification來處理析苫。系統(tǒng)消息userInfo主要包含兩個鍵:
AVAudioSessionInterruptionTypeKey: 取值為AVAudioSessionInterruptionTypeBegan表示中斷開始,我們應(yīng)該暫停播放和采集穿扳,取值為AVAudioSessionInterruptionTypeEnded表示中斷結(jié)束衩侥,我們可以繼續(xù)播放和采集。
AVAudioSessionInterruptionOptionKey: 當(dāng)前只有一種值A(chǔ)VAudioSessionInterruptionOptionShouldResume表示此時也應(yīng)該恢復(fù)繼續(xù)播放和采集矛物。
其他app占用通知
其他App占據(jù)AudioSession的時候用AVAudioSessionSilenceSecondaryAudioHintNotification來進行通知茫死。其回調(diào)回來的userInfo鍵為:AVAudioSessionSilenceSecondaryAudioHintTypeKey
AVAudioSessionSilenceSecondaryAudioHintTypeBegin:表示其他App開始占據(jù)Session
AVAudioSessionSilenceSecondaryAudioHintTypeEnd:表示其他App開始釋放Session
外設(shè)改變通知
默認(rèn)情況下,AVAudioSession會在App啟動時選擇一個最優(yōu)的輸出方案履羞,比如插入耳機的時候峦萎,就用耳機。但是這個過程中忆首,用戶可能拔出耳機爱榔,app可以通過監(jiān)聽系統(tǒng)消息:AVAudioSessionRouteChangeNotification來處理。
針對視頻通話場景設(shè)置
類別:AVAudioSessionCategoryPlayAndRecord類別的選項:AVAudioSessionCategoryOptionAllowBluetoothAVAudioSessionCategoryOptionDefaultToSpeaker模式:AVAudioSessionModeVideoChat