1. AVAudioSession
AVAudioSession,是用来管理多个APP间对音频硬件设备(麦克风,扬声器)的资源使用。
举例一下AVAudioSession可以做这些事情
- 设置自己的APP是否和其他APP音频同时存在,还是中断其他APP声音
- 在手机调到静音模式下,自己的APP音频是否可以播放出声音
- 电话或者其他APP中断自己APP的音频的事件处理
- 指定音频输入和输出的设备(比如是听筒输出声音,还是扬声器输出声音)
- 是否支持录音,录音同时是否支持音频播放
2. AVAudioSession Category
Category定义了七种主场景,每种Category都对应是否支持下面四种能力。
- Interrupts non-mixable apps audio:是否打断不支持混音播放的APP
- Silenced by the Silent switch:是否会响应手机静音键开关
- Supports audio input:是否支持音频录制
- Supports audio output:是否支持音频播放
Category | 是否允许音频播放/录音 | 是否打断其他不支持混音APP | 是否会被静音键或锁屏键静音 |
---|---|---|---|
AVAudioSessionCategorySoloAmbient | 只支持播放 | 是 | 是 |
AVAudioSessionCategoryAmbient | 只支持播放 | 否 | 是 |
AVAudioSessionCategoryPlayback | 只支持播放 | 默认YES,可以重写为NO | 否 |
AVAudioSessionCategoryRecord | 只支持录制 | 是 | 否(锁屏下仍可录制) |
AVAudioSessionCategoryPlayAndRecord | 支持播放,支持录制 | 默认YES,可以重写为NO | 否 |
AVAudioSessionCategoryAudioProcessing | 不支持播放,不支持录制 | 是 | 否 |
AVAudioSessionCategoryMultiRoute | 支持播放,支持录制 | 是 | 否 |
APP启动的时候会自动帮激活AVAudioSession(默认是AVAudioSessionCategorySoloAmbient)
#import <AVFoundation/AVFoundation.h>
/*
* APP启动后激活声道音频模式
**/
+ (void)configAvSessionCategoryWithError:(NSError **)error {
AVAudioSession *session = [AVAudioSession sharedInstance];
//AVAudioSessionCategorySoloAmbient是系统默认的category
[session setCategory:AVAudioSessionCategorySoloAmbient error:nil];
//激活AVAudioSession
[session setActive:YES error:nil];
}
3. 暂停及恢复后台音频播放示例
如果在播放自己APP中的音频时,需要暂停后台其他APP的音乐播放;
当播放完成后,再恢复之前后台其他音频的自动播放;
代码如下:
#import <AVFoundation/AVFoundation.h>
/*
* 比如临时视频播放等APP,需要播放自己的音乐,暂停后台背景音乐的播放(激活当前应用的audio)
**/
+ (void)pauseOtherAppSoundWithError:(NSError **)error {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:error];//仅播放时
//[session setCategory:AVAudioSessionCategoryRecord error:nil];//需要录音时
//Activate audio session in current app
//Deactivate audio session in others' app
[session setActive:YES error:error];
}
/*
* 自己APP停止播放后,继续恢复后台其他APP背景音乐的播放(取消激活当前应用的audio session)
**/
+ (void)resumeOtherAppSoundWithError:(NSError **)error {
[[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:error];
}