IOS上AudioSession設置, 切換揚聲器和聽筒詳解

本文轉自:http://blog.csdn.net/xy5811/article/details/8563137

選擇一個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提供錄音和播放功能。

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

注意:並不是一個應用只能使用一個category,程序應該根據實際需要來切換設置不同的category,舉個例子,錄音的時候,需要設置爲AVAudioSessionCategoryRecord,當錄音結束時,應根據程序需要更改category爲爲AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbientAVAudioSessionCategoryPlayback中的一種。

Property

​kAudioSessionProperty_OverrideCategory​MixWithOthers 允許和其他app同時播放聲音

​kAudioSessionProperty_OtherMixableAudio​ShouldDuck   允許和其他app同時播放聲音,但會將其他app的聲音變小




如果想實現既能在後臺播放聲音,又能隨着靜音鍵而靜音的功能,可以這麼做:

[html] view plaincopy
  1. setCategory(AVAudioSessionCategoryPlayBack);  
  2. playSound();  
  3. setCategory(AVAudioSessionCategoryAmbient);  


設置Category

  1. <span style="font-size: 14px;">NSError *setCategoryError = nil;  
  2.     BOOL success = [[AVAudioSession sharedInstance]  
  3.                     setCategory: AVAudioSessionCategoryAmbient  
  4.                     error: &setCategoryError];  
  5.       
  6.     if (!success) { /* handle the error in setCategoryError */ }</span>  


切換到揚聲器

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

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

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

  1. enum {    
  2.    kAudioSessionOverrideAudioRoute_None    = 0,  
  3.    kAudioSessionOverrideAudioRoute_Speaker = 'spkr'  
  4. };  
Override audio route的方法有如下兩種:

  1. UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  
  2.       
  3.     AudioSessionSetProperty (  
  4.                              kAudioSessionProperty_OverrideAudioRoute  
  5.                              sizeof (audioRouteOverride),  
  6.                              &audioRouteOverride  
  7.                              );  

  1. UInt32 doChangeDefaultRoute = 1;  
  2.       
  3.     AudioSessionSetProperty (  
  4.                              kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,  
  5.                              sizeof (doChangeDefaultRoute),  
  6.                              &doChangeDefaultRoute  
  7.                              );  

這兩種方法區別在於:

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

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



下面給出一段仿微信的切換揚聲器和聽筒代碼:

  1. [[UIDevice currentDevice] setProximityMonitoringEnabled:YES]; //建議在播放之前設置yes,播放結束設置NO,這個功能是開啓紅外感應  
  2.   
  3. //添加監聽  
  4. [[NSNotificationCenter defaultCenter] addObserver:self  
  5. selector:@selector(sensorStateChange:)  
  6. name:@"UIDeviceProximityStateDidChangeNotification"  
  7. object:nil];  
  8.   
  9. //處理監聽觸發事件  
  10. -(void)sensorStateChange:(NSNotificationCenter *)notification;  
  11. {  
  12. //如果此時手機靠近面部放在耳朵旁,那麼聲音將通過聽筒輸出,並將屏幕變暗(省電啊)  
  13. if ([[UIDevice currentDevice] proximityState] == YES)  
  14. {  
  15. NSLog(@"Device is close to user");  
  16. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];  
  17.   
  18. }  
  19. else  
  20. {  
  21. NSLog(@"Device is not close to user");  
  22. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];  
  23. }  
  24. }  
  25.   
  26.   
  27. //初始化播放器的時候如下設置  
  28. UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;  
  29. AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,  
  30. sizeof(sessionCategory),  
  31. &sessionCategory);   
  32.   
  33. UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;  
  34. AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,  
  35. sizeof (audioRouteOverride),  
  36. &audioRouteOverride);  
  37.   
  38. AVAudioSession *audioSession = [AVAudioSession sharedInstance];  
  39. //默認情況下揚聲器播放  
  40. [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];  
  41. [audioSession setActive:YES error:nil]; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章