AVAudioSession应用指南

转coco-LG

audiosession负责调节你的app和ios系统里的音频行为.一旦加载了audiosession你可以获得一个audiosession的单例.你可以配置这个audiosession来控制你的app的音频行为.例如:

  • 当你的app播放声音的时候,你是希望其他正在播放声音的app静音还是混合两个app的声音?
  • 你的app如何回应突发的打断,例如这时候闹铃突然响了?
  • 你的app又该如何回应耳机口的拔插呢?

AuioSession的配置会影响你的app在运行中所有的音频活动,除了利用System Sounds Services API控制的音频.

你还可以利用AudioSession来检测你所用硬件的参数,例如声道和采样率.

你还可以随时激活或者停止你的audioSession,当你的app播放声音或者正在录音的时候,你必须确保AudioSession处于激活状态.

系统也有权利随时中断你的audioSession,例如,当你来电话的时候.当然,AudioSession提供了api来让你的app从这种中断中恢复.

一、实例化

[objc] view plain copy
 
  1. AVAudioSession *audioSession = [AVAudioSession sharedInstance];  

可以看出AVAudioSession是个单例对象。

二、类别设置

在获得一个AVAudioSession类的实例后,你就能通过调用音频会话对象的setCategory:error:实例方法,来从IOS应用可用的不同类别中作出选择。类别分为一下几种:

[objc] view plain copy
 
  1. #pragma mark -- Values for the category property --  
  2.   
  3. /*  Use this category for background sounds such as rain, car engine noise, etc.   
  4.  Mixes with other music. */  
  5. AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;  
  6.       
  7. /*  Use this category for background sounds.  Other music will stop playing. */  
  8. AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;  
  9.   
  10. /* Use this category for music tracks.*/  
  11. AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;  
  12.   
  13. /*  Use this category when recording audio. */  
  14. AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;  
  15.   
  16. /*  Use this category when recording and playing back audio. */  
  17. AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;  
  18.   
  19. /*  Use this category when using a hardware codec or signal processor while 
  20.  not playing or recording audio. */  
  21. AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing NS_DEPRECATED_IOS(3_0, 10_0) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;  

1.AVAudioSessionCategoryAmbient

用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音
 
 2.AVAudioSessionCategorySoloAmbient
 类似于AVAudioSessionCategoryAmbient不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音
 
 3.AVAudioSessionCategoryPlayback
 用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音
 
 4.AVAudioSessionCategoryRecord
 用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。
 
5. AVAudioSessionCategoryPlayAndRecord
 用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。
 
 注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

三、恢复外部音乐

从上面的类别可以看出,在录音或播音的的时候是会关闭外部正在播放的音频。比如微信发语音的时候,正在播放的音乐会停止。但是录完之后需要让外部音效继续播放。这个需要手动设置

[objc] view plain copy
 
  1. [[AVAudioSession sharedInstance] setActive:NO  
  2.                  withFlags:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation  
  3.                      error:nil];  

这里需要注意一个问题,如果在录音或播音前本来就没有外部音效播放,直接执行这一句会使cocos2d里面的部分音效异常。所以,在开始录音或播音之前先判断一下是否有外部音效播放,然后用一个标志位记录,在录音或播音完成之后对这个标志位做判断,如果有外部音效,则执行上边的代码去恢复外部音效。下面是判断外部音效的代码:

[objc] view plain copy
 
  1. -(BOOL) isOtherAudioPlaying {  
  2.     UInt32 isPlaying = 0;  
  3.     UInt32 varSize = sizeof(isPlaying);  
  4.     AudioSessionGetProperty (kAudioSessionProperty_OtherAudioIsPlaying, &varSize, &isPlaying);  
  5.     return (isPlaying != 0);  
  6. }  

四、协调当前应用的背景音效

如果当我们遇到这样一种情况:自己的应用有背景音乐,这时候需要录音,录完音还要恢复播放背景音乐。这个只需要再设置一次背景音乐的类别,一般背景音乐都是系统默认类别:

[objc] view plain copy
 
  1. [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];  

五、注意点

1.如果在录音或播音前本来就没有外部音效播放,直接执行这一句会使cocos2d里面的部分音效异常。所以,在开始录音或播音之前先判断一下是否有外部音效播放,然后用一个标志位记录,在录音或播音完成之后对这个标志位做判断,如果有外部音效,则执行上边的代码去恢复外部音效;

2.有背景音乐的时候执行“恢复外部音乐”出现警告Deactivating an audio session that has running I/O

        具体讲解请参考:http://blog.csdn.net/gang544043963/article/details/53323270

原文地址:https://www.cnblogs.com/8335IT/p/8406864.html