IOS7使用Audio Queue同时进行录音和播放

来源:互联网 发布:windows api 怎么使用 编辑:程序博客网 时间:2024/05/17 22:15

       首先,必须先说明使用Audio Queue来同时进行录音和播放的优势。如果想在iOS设备上播放和录制音频,苹果推荐我们使用AVFoundation框架中的AVAudioPlayer和AVAudioRecorder类。虽然用法比较简单,但是不支持流式;这就意味着:在播放音频前,必须等到整个音频加载完成后,才能开始播放音频;录音时,也必须等到录音结束后,才能获取到录音数据。这给应用造成了很大的局限性。特别是在需要实时处理录音数据(如音频通信)、实时语音通话(如微信语音)的情况下,AVAudioPlayer和AVAudioRecorder类都无法完美达到设计目的,需要采用Audio Queue。

       一般,我们要同时使用录音和播放时,需要进行如下设置:

       UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;  

       AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);  

       但是,这样同时使用录音和播放,其播放的效果会远远差于单独使用播放的效果,(听起来就是声音变小了),就算你通过设置kAudioQueueParam_Volume参数将音量变大也没用。

       这是因为kAudioSessionCategory_PlayAndRecord默认的是听筒模式,而 kAudioSessionCategory_Playback; 是扬声器模式。

       故为了达到同样效果,我们还需要切换扬声器模式,还需进行如下设置:

            UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;    

            AudioSessionSetProperty (  

                             kAudioSessionProperty_OverrideAudioRoute  

                             sizeof (audioRouteOverride),                           

                             &audioRouteOverride  

                             );  

           或是:

            UInt32 doChangeDefaultRoute = 1;     

            AudioSessionSetProperty (  

                             kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,  

                             sizeof (doChangeDefaultRoute),  

                             &doChangeDefaultRoute  

                             );  

             这两种方法区别在于:

                    使用kAudioSessionProperty_OverrideAudioRoute时,当发生任何中断如插拔耳机时,audio route就会重置回听筒,你必须再设置一次。

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

         (参见http://blog.csdn.net/xy5811/article/details/8563137)里面有详细描述。

         但在IOS7中,已经废除了AudioSessionSetProperty, kAudioSessionCategory_PlayAndRecord,kAudioSessionProperty_OverrideCategoryDefaultToSpeaker等函数或枚举变量。要想同时使用录音和播放,需如下设置:

        [[AVAudioSession sharedInstance]]setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

        如果想同时使用扬声器模式,需如下设置:

        [[AVAudioSession sharedInstance]]setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil];

        在实际使用时,还需进行如下设置:

        [[AVAudioSession sharedInstance]]setActive:YES error:nil];

        可以使设置马上生效。

 

        参考资料:

Audio Queue Services Programming Guide

https://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc

IOS上AudioSession设置, 切换扬声器和听筒详解

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