AVAudioSession应用指南

    xiaoxiao2021-12-14  18

    官方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

    转载请注明原文地址: https://ju.6miu.com/read-969343.html

    最新回复(0)