IOS 使用揚聲器和聽筒之間的切換-----IOS上AudioSession設置, 切換揚聲器和聽筒詳解 .


 

選擇一個Category

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

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

AVAudioSessionCategoryPlayback 或 kAudioSessionCategory_MediaPlayback——用於以語音為主的應用,使用這個category的應用不會隨着靜音鍵和屏幕關閉而靜音。

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

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

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

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

設置Category

 

  1. <SPAN style="FONT-SIZE: 14px">NSError *setCategoryError = nil;  
        BOOL success = [[AVAudioSession sharedInstance]  
                        setCategory: AVAudioSessionCategoryAmbient  
                        error: &setCategoryError];  
          
        if (!success) { /* handle the error in setCategoryError */ }</SPAN>  
    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屬性有以下兩個,一個是默認的聽筒,另一個則是揚聲器。

 

  1. enum {    
       kAudioSessionOverrideAudioRoute_None    = 0,  
       kAudioSessionOverrideAudioRoute_Speaker = 'spkr'  
    };  
    enum {  
       kAudioSessionOverrideAudioRoute_None    = 0,
       kAudioSessionOverrideAudioRoute_Speaker = 'spkr'
    };

     

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

 

  1. 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
                                 );
     

     

 

這兩種方法區別在於:

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM