🌚汪汪汪会跳舞🌚
⓵💧程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。💧 ⓶ 💧好的产品。好的产品。好的产品。细节决定成败!!!💧

 

选择一个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

posted on 2015-04-21 14:46  Orangutan_Big  阅读(2673)  评论(0编辑  收藏  举报