iOS端對(duì)AVAudioSession的統(tǒng)一管理
本文介紹遇到App有多個(gè)模塊因搶奪AVAudioSession的管理,引起參數(shù)不合理設(shè)置,導(dǎo)致音頻采集和播放異常的問題。
一些iOS App 在集成RTC SDK的同時(shí),也集成了播放器SDK,并且業(yè)務(wù)場(chǎng)景上播放器和RTC還需要同時(shí)工作。因?yàn)镽TC SDK和播放器SDK在內(nèi)部都在對(duì)AVAudioSession進(jìn)行管理,設(shè)置的參數(shù)只考慮了自己的場(chǎng)景需求,并且AVAudioSession是單例,這樣就造成RTC和播放器并行工作會(huì)出現(xiàn)音頻采集和音頻播放的各種問題。
為了解決此場(chǎng)景的AVAudioSession沖突的問題,RTC SDK和播放器需要將AVAudioSession的管理交由App來進(jìn)行統(tǒng)一管理。RTC iOS SDK提供如下API來實(shí)現(xiàn):
setAudioSessionOperationRestriction:DingRtcAudioSessionOperationRestrictionConfigureSession
除了RTC SDK,播放器SDK也需要做同樣的設(shè)置。
接下來就需要App統(tǒng)一管理AVAudioSession,根據(jù)使用場(chǎng)景設(shè)置合理Category、Options、Mode。
Category說明
Category | 說明 | |
AVAudioSessionCategorySoloAmbient | 系統(tǒng)默認(rèn) - 可以進(jìn)行播放,但是不能進(jìn)行錄制。 - 當(dāng)用戶將手機(jī)上的靜音撥片撥到“靜音”狀態(tài)時(shí),此時(shí)如果正在播放音頻,那么播放內(nèi)容會(huì)被靜音。 - 當(dāng)用戶按了手機(jī)的鎖屏鍵或者手機(jī)自動(dòng)鎖屏了,此時(shí)如果正在播放音頻,那么播放會(huì)靜音并被暫停。 - 如果你的App在開始播放的時(shí)候,此時(shí)QQ音樂等其他App正在播放,那么其他播放器會(huì)被靜音并暫停。 | |
AVAudioSessionCategoryPlayback | 適合播放場(chǎng)景 - 可以進(jìn)行播放,但是不能進(jìn)行錄制。 - 當(dāng)用戶將手機(jī)上的靜音撥片撥到“靜音”狀態(tài)時(shí),此時(shí)如果正在播放音頻,那么播放內(nèi)容仍會(huì)繼續(xù)。 - 當(dāng)用戶按了手機(jī)的鎖屏鍵或者手機(jī)自動(dòng)鎖屏了,此時(shí)如果正在播放音頻,那么播放內(nèi)容仍會(huì)繼續(xù)。 - 如果你的App在開始播放的時(shí)候,此時(shí)QQ音樂等其他App正在播放,那么其他播放器會(huì)被靜音并暫停。 | |
AVAudioSessionCategoryPlayAndRecord | 適合RTC場(chǎng)景 - 可以進(jìn)行播放,也可以進(jìn)行錄制。 - 當(dāng)用戶將手機(jī)上的靜音撥片撥到“靜音”狀態(tài)時(shí),此時(shí)如果正在播放音頻,那么播放內(nèi)容仍會(huì)繼續(xù)。 - 當(dāng)用戶按手機(jī)的鎖屏鍵或者手機(jī)自動(dòng)鎖屏,此時(shí)如果正在播放音頻,那么播放內(nèi)容仍會(huì)繼續(xù)。 - 如果你的App在開始播放的時(shí)候,此時(shí)QQ音樂等其他App正在播放,那么其他播放器會(huì)被靜音并暫停。 |
Options說明
Option | 適用Category | 作用 |
AVAudioSessionCategoryOption MixWithOthers | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord | 和其他后臺(tái)App進(jìn)行混音。 |
AVAudioSessionCategoryOption DuckOthers | AVAudioSessionCategoryPlayback AVAudioSessionCategoryPlayAndRecord | 和其他后臺(tái)App進(jìn)行混音,并且壓低其他App聲音。 |
AVAudioSessionCategoryOption AllowBluetooth | AVAudioSessionCategoryPlayAndRecord | 支持藍(lán)牙耳機(jī)。 |
AVAudioSessionCategoryOption DefaultToSpeaker | AVAudioSessionCategoryPlayAndRecord | 默認(rèn)免提聲音。 |
Mode說明
Mode | 適用Category | 場(chǎng)景 |
AVAudioSessionMode Default | 所有 | 默認(rèn)模式 |
AVAudioSessionMode VoiceChat | AVAudioSessionCategory PlayAndRecord |
|
對(duì)于播放場(chǎng)景建議參數(shù)搭配:
AVAudioSessionCategoryPlayback + AVAudioSessionCategoryOptionMixWithOthers
對(duì)于RTC場(chǎng)景建議參數(shù)搭配有:
AVAudioSessionCategoryPlayAndRecord + AVAudioSessionCategoryOptionMixWithOthers + AVAudioSessionCategoryOptionAllowBluetooth + AVAudioSessionCategoryOptionDefaultToSpeaker + AVAudioSessionModeVoiceChat
開發(fā)者可以根據(jù)實(shí)際情況優(yōu)化參數(shù)設(shè)置。比如RTC場(chǎng)景如果希望RTC的聲音更清楚些,可以選擇AVAudioSessionCategoryOptionDuckOthers,代替推薦的AVAudioSessionCategoryOptionMixWithOthers;如果RTC是音樂場(chǎng)景,希望聲音盡量保持原始聲音,可以使用AVAudioSessionModeDefault,代替推薦的AVAudioSessionModeVoiceChat,此時(shí)為了避免回音,RTC需要啟用軟件3A。
所有對(duì)AVAudioSession參數(shù)的設(shè)置,請(qǐng)?jiān)诓シ牌鏖_始播放之前,在RTC開始推流拉流之前,否則可能會(huì)不生效,或者異常。