AVAudioSession初探
根据文档,AudioSession规定了app和系统音频行为交互的规范,一个app只有一个AudioSession的单例。
app通过设置自己AudioSession的单例的属性来告诉系统自身想达到的效果,系统会根据app的申请,并综合考虑其他app的AudioSession的属性来决定最后硬件的音频输入和输出。
AVAudioSession的category
AVAudioSession可以通过设置category的类型类配置AVAudioSession的一些属性,如
- 在静音开关打开或锁屏的情况下是否可以继续播放
- 是否可以和其他APP的声音混合播放
- 是否允许输入输出
下表是文档中给出的可以设置的category及其对应的表现。

在程序中切换category
在程序的运行过程中,有时需要切换AVAudiosession的Category。通过调用- (BOOL)setCategory:(NSString *)category error:(NSError **)outError;
这个方法可以达到效果。
然而,不是所有的category的切换都是即时发生的。由于涉及到硬件,有些category的切换需要时间,有些category的切换不需要时间或需要的时间很短。
下面的结论是在AVAudioSessionCategoryPlayAndRecord
、AVAudioSessionCategoryPlayback
、AVAudioSessionCategorySoloAmbient
之间的切换所需时间。
from | to | 时间(s) |
---|---|---|
PlayAndRecord | Playback | 0.3-0.4 |
PlayAndRecord | SoloAmbient | 0.3-0.4 |
Playback | SoloAmbient | 0.01 |
Playback | PlayAndRecord | 0.3-0.4 |
SoloAmbient | PlayAndRecord | 0.3-0.4 |
SoloAmbient | Playback | 0.01 |
可见,涉及到input和output改变的category切换的花费的时间较多。可以猜想改变input和output的行为设计到硬件,切换需要时间。
测试环境
iOS10,iPhone6, 真机,且测试时有音频在播放
代码如下
- (void)changeCategory:(NSString*)category
{
NSError *error = nil;
NSString *currentCategory = [[AVAudioSession sharedInstance] category];
NSLog(@"before set category, category is %@",currentCategory);
[[AVAudioSession sharedInstance] setCategory:category error:&error];
NSLog(@"after set category");
currentCategory = [[AVAudioSession sharedInstance] category];
NSLog(@"category is %@",currentCategory);
if (error != nil)
{
NSLog(@"category error %@",error);
}
}
下起雨,也要勇敢前行