主要解決錄音時候不能讓當前app內(nèi)音外放

選擇一個Category

AVAudioSessionCategoryAmbient或kAudioSessionCategory_AmbientSound——用于非以語音為主的應用,使用這個category的應用會隨著靜音鍵和屏幕關(guān)閉而靜音。并且不會中止其它應用播放聲音,可以和其它自帶應用如iPod,safari等同時播放聲音。

AVAudioSessionCategorySoloAmbient或kAudioSessionCategory_SoloAmbientSound——類似于AVAudioSessionCategoryAmbient不同之處在于它會中止其它應用播放聲音。 這個category為默認category。

AVAudioSessionCategoryPlayback或kAudioSessionCategory_MediaPlayback——用于以語音為主的應用,使用這個category的應用不會隨著靜音鍵和屏幕關(guān)閉而靜音。

AVAudioSessionCategoryRecord或kAudioSessionCategory_RecordAudio———用于需要錄音的應用,設置該category后,除了來電鈴聲,鬧鐘或日歷提醒之外的其它系統(tǒng)聲音都不會被播放。

AVAudioSessionCategoryPlayAndRecord或kAudioSessionCategory_PlayAndRecord——用于既需要播放聲音又需要錄音的應用,語音聊天應用(如微信)應該使用這個category。

AVAudioSessionCategoryAudioProcessing或kAudioSessionCategory_AudioProcessing————當需要進行離線語音處理時使用這個category,這里我也不太明白離線語音處理是什么概念,希望有知道的可以解釋下。

注意:并不是一個應用只能使用一個category,程序應該根據(jù)實際需要來切換設置不同的category,舉個例子,錄音的時候,需要設置為AVAudioSessionCategoryRecord,當錄音結(jié)束時,應根據(jù)程序需要更改category為AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一種。

設置Category

NSError?*setCategoryError?=?nil;

BOOLsuccess?=?[[AVAudioSession?sharedInstance]

setCategory:?AVAudioSessionCategoryAmbient

error:?&setCategoryError];

if(!success)?{/*?handle?the?error?in?setCategoryError?*/}

NSError *setCategoryError = nil;

BOOL success = [[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryAmbient

error: &setCategoryError];

if (!success) { /* handle the error in setCategoryError */ }

切換到揚聲器

按照蘋果官方文檔的說法,只有在category設置為AVAudioSessionCategoryPlayAndRecord時才能從揚聲器播放聲音,這一點我還未證實。

總之,按照官方文檔的說法,先設置category為AVAudioSessionCategoryPlayAndRecord,然后通過重寫audio route屬性來重定向音頻。

audio route屬性有以下兩個,一個是默認的聽筒,另一個則是揚聲器。

enum{

kAudioSessionOverrideAudioRoute_None????=?0,

kAudioSessionOverrideAudioRoute_Speaker?='spkr'

};

enum {

kAudioSessionOverrideAudioRoute_None? ? = 0,

kAudioSessionOverrideAudioRoute_Speaker = 'spkr'

};

Override audio route的方法有如下兩種:

UInt32?audioRouteOverride?=?kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty?(

kAudioSessionProperty_OverrideAudioRoute

sizeof(audioRouteOverride),

&audioRouteOverride

);

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty (

kAudioSessionProperty_OverrideAudioRoute

sizeof (audioRouteOverride),

&audioRouteOverride

);

UInt32?doChangeDefaultRoute?=?1;

AudioSessionSetProperty?(

kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,

sizeof(doChangeDefaultRoute),

&doChangeDefaultRoute

);

UInt32 doChangeDefaultRoute = 1;

AudioSessionSetProperty (

kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,

sizeof (doChangeDefaultRoute),

&doChangeDefaultRoute

);

這兩種方法區(qū)別在于:

使用kAudioSessionProperty_OverrideAudioRoute時,當發(fā)生任何中斷如插拔耳機時,audio route就會重置回聽筒,你必須再設置一次。

使用kAudioSessionProperty_OverrideCategoryDefaultToSpeaker則除非你更改category,否則會一直生效。

轉(zhuǎn)自http://blog.csdn.net/xy5811/article/details/8563137


在獲得一個AVAudioSession類的實例后,你就能通過調(diào)用音頻會話對象的setCategory:error:實例方法,來從IOS應用可用的不同類別中作出選擇。下面列出了可供使用的音頻會話類別:

AVAudioSessionCategorySoloAmbient

這個類別非常像AVAudioSessionCategoryAmbient類別,除了會停止其他程序的音頻回放,比如iPod程序。當設備被設置為靜音模式,你的音頻回放將會停止。

AVAudioSessionCategoryRecord

這會停止其他應用的聲音(比如iPod)并讓你的應用也不能初始化音頻回放(比如AVAudioPlayer)。在這種模式下,你只能進行錄音。使用這個類別,調(diào)用AVAudioPlayer的prepareToPlay會返回YES,但是調(diào)用play方法將返回NO。主UI界面會照常工作。這時,即使你的設備屏幕被用戶鎖定了,應用的錄音仍會繼續(xù)。

AVAudioSessionCategoryPlayback

這個類別會靜止其他應用的音頻回放(比如iPod應用的音頻回放)。你可以使用AVAudioPlayer的prepareToPlay和play方法,在你的應用中播放聲音。主UI界面會照常工作。這時,即使屏幕被鎖定或者設備為靜音模式,音頻回放都會繼續(xù)。

AVAudioSessionCategoryPlayAndRecord

這個類別允許你的應用中同時進行聲音的播放和錄制。當你的聲音錄制或播放開始后,其他應用的聲音播放將會停止。主UI界面會照常工作。這時,即使屏幕被鎖定或者設備為靜音模式,音頻回放和錄制都會繼續(xù)。

AVAudioSessionCategoryAudioProcessing

這個類別用于應用中進行音頻處理的情形,而不是音頻回放或錄制。設置了這種模式,你在應用中就不能播放和錄制任何聲音。調(diào)用AVAPlayer的prepareToPlay和play方法都將返回NO。其他應用的音頻回放,比如iPod,也會在此模式下停止。

AVAudioSessionCategoryAmbient

這個類別不會停止其他應用的聲音,相反,它允許你的音頻播放于其他應用的聲音之上,比如iPod。你的應用的主UI縣城會工作正常。調(diào)用AVAPlayer的prepareToPlay和play方法都將返回YES。當用戶鎖屏時,你的應用將停止所有正在回放的音頻。僅當你的應用是唯一播放該音頻文件的應用時,靜音模式將停止你程序的音頻回放。如果正當iPod播放一手歌時,你開始播放音頻,將設備設為靜音模式并不能停止你的音頻回放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容