1. 程式人生 > >iOS AudioSession詳解 Category選擇 聽筒揚聲器切換kAudioSessionCategory_MediaPlayback

iOS AudioSession詳解 Category選擇 聽筒揚聲器切換kAudioSessionCategory_MediaPlayback

選擇一個Category

AVAudioSessionCategoryAmbient 或 kAudioSessionCategory_AmbientSound

——用於非以語音為主的應用,使用這個category的應用會隨著靜音鍵和螢幕關閉而靜音。並且不會中止其它應用播放聲音,可以和其它自帶應用如iPod,safari等同時播放聲音。注意:該Category無法在後臺播放聲音

AVAudioSessionCategorySoloAmbient 或 kAudioSessionCategory_SoloAmbientSound

——類似於AVAudioSessionCategoryAmbient 

不同之處在於它會中止其它應用播放聲音。 這個category為預設category。該Category無法在後臺播放聲音

AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback

——用於以語音為主的應用,使用這個category的應用不會隨著靜音鍵和螢幕關閉而靜音。可在後臺播放聲音

AVAudioSessionCategoryRecord 或 kAudioSessionCategory_RecordAudio

———用於需要錄音的應用,設定該category後,除了來電鈴聲,鬧鐘或日曆提醒之外的其它系統聲音都不會被播放。該Category只提供單純錄音功能。


AVAudioSessionCategoryPlayAndRecord 或 kAudioSessionCategory_PlayAndRecord

——用於既需要播放聲音又需要錄音的應用,語音聊天應用(如微信)應該使用這個category。該Category提供錄音和播放功能。如果你的應用需要用到iPhone上的聽筒,該category是你唯一的選擇,在該Category下聲音的預設出口為聽筒(在沒有外接裝置的情況下)。

注意:並不是一個應用只能使用一個category,程式應該根據實際需要來切換設定不同的category,舉個例子,錄音的時候,需要設定為AVAudioSessionCategoryRecord,

當錄音結束時,應根據程式需要更改category為AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbientAVAudioSessionCategoryPlayback中的一種。


設定Category

  1. NSError *setCategoryError = nil;  
  2. BOOL success = [[AVAudioSession sharedInstance]  
  3.                 setCategory: AVAudioSessionCategoryAmbient  
  4.                 error: &setCategoryError];  
  5. if (!success) { /* handle the error in setCategoryError */ }  

Activate & Deactivate AudioSession

  1. NSError *error = nil;  
  2. AVAudioSession *audioSession = [AVAudioSession sharedInstance];  
  3. BOOL ret = [audioSession setActive:YES error:&error];  
  4. if (!ret)  
  5. {  
  6.     NSLog(@"%s - activate audio session failed with error %@", __func__,[error description]);  
  7. }  

  1. NSError *error = nil;  
  2. AVAudioSession *audioSession = [AVAudioSession sharedInstance];  
  3. //Note: Set AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation to resume other apps' audio.
  4. BOOL ret = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];  
  5. if (!ret)  
  6. {  
  7. }  


Audio Route的選擇

當你的iPhone接有多個外接音訊裝置時(耳塞,藍芽耳機等),AudioSession將遵循last-in wins的原則來選擇外接裝置,即聲音將被導向最後接入的裝置。

當沒有接入任何音訊裝置時,一般情況下聲音會預設從揚聲器出來,但有一個例外的情況:PlayAndRecord這個category下,聽筒會成為預設的輸出裝置。如果你想要改變這個行為,可以提供MPVolumeView來讓使用者切換到揚聲器,也可通過overrideOutputAudioPort方法來programmingly切換到揚聲器,也可以修改category option為AVAudioSessionCategoryOptionDefaultToSpeaker。

PlayandRecord下切換到揚聲器

除了讓使用者手動選擇,你也可以通過以下兩種方法在程式裡進行切換

1. 修改Category的預設行為:

  1. [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];  
2. OverrideOutputAudioPort:
  1. [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];