選擇一個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播放一手歌時,你開始播放音頻,將設備設為靜音模式并不能停止你的音頻回放。