AVAudioSession应用指南

官方API文档是这样对AVAudioSession描述的:

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从这种中断中恢复.

一、实例化

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

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

二、类别设置

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

#pragma mark -- Values for the category property --

/*  Use this category for background sounds such as rain, car engine noise, etc.  
 Mixes with other music. */
AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;
	
/*  Use this category for background sounds.  Other music will stop playing. */
AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;

/* Use this category for music tracks.*/
AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;

/*  Use this category when recording audio. */
AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;

/*  Use this category when recording and playing back audio. */
AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;

/*  Use this category when using a hardware codec or signal processor while
 not playing or recording audio. */
AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing NS_DEPRECATED_IOS(3_0, 10_0) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;

1.AVAudioSessionCategoryAmbient

用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音

  2.AVAudioSessionCategorySo loAmbient
  类似于AVAudioSessionCategoryAm bient不同之处在于它会中止其它应用播放声音。 这个category为默认category。该Category无法在后台播放声音

  3.AVAudioSessionCategoryPl ayback
  用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。可在后台播放声音

  4.AVAudioSessionCategoryRe cord
  用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。

5. AVAudioSessionCategoryPl ayAndRecord
  用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。如果你的应用需要用到iPhone上的听筒,该category是你唯一的选择,在该Category下声音的默认出口为听筒(在没有外接设备的情况下)。

  注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRe cord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAm bient,AVAudioSessionCategorySo loAmbient或AVAudioSessionCategoryPl ayback中的一种。

三、恢复外部音乐

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

[[AVAudioSession sharedInstance] setActive:NO
				 withFlags:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
				     error:nil];

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

-(BOOL) isOtherAudioPlaying {
    UInt32 isPlaying = 0;
    UInt32 varSize = sizeof(isPlaying);
    AudioSessionGetProperty (kAudioSessionProperty_OtherAudioIsPlaying, &varSize, &isPlaying);
    return (isPlaying != 0);
}


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

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

[[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

你可能感兴趣的:(iOS开发)