之前觉得ios 嘛,音视频既然和硬件有一定关系的话,那么就苹果怎么规定就怎么写喽,但是一切都是从小事情做起的,如果那天去面试直接这样子说,那么对“技术”的不屑一顾自然也会被面试官不屑一顾,那么就跟随我一起来探秘下苹果给我们的接口
iOS给出的解决方案是"AVAudioSession"
Session默认行为
1.可以进行播放,但是不能进行录制。
2.当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容会被静音。
3.当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频,那么播放会静音并被暂停。
4.如果你的App在开始播放的时候,此时QQ音乐等其他App正在播放,那么其他播放器会被静音并暂停。
虽然系统会在App启动的时候,激活这个唯一的AVAudioSession,但是最好还是在自己ViewController的
viewDidLoad
里面再次进行激活:
- (BOOL)setActive:(BOOL)active
error:(NSError * _Nullable *)outError;
如何要让自己的Session解除激活后恢复其他App Session的激活状态呢?
-(BOOL)setActive:(BOOL)active
- withOptions:(AVAudioSessionSetActiveOptions)options
error:(NSError * _Nullable *)outError;
AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
即可。
当然,也可以通过
otherAudioPlaying
变量来提前判断当前是否有其他App在播放音频。
七大Category
类别 | 当按“静音”或者锁屏是是否静音 | 是否引起不支持混音的App中断 | 是否支持录音和播放 |
---|---|---|---|
AVAudioSessionCategoryAmbient | 是 | 否 | 只支持播放 |
AVAudioSessionCategoryAudioProcessing | - | 都不支持 | |
AVAudioSessionCategoryMultiRoute | 否 | 是 | 既可以录音也可以播放 |
AVAudioSessionCategoryPlayAndRecord | 否 | 默认不引起 | 既可以录音也可以播放 |
AVAudioSessionCategoryPlayback | 否 | 默认引起 | 只用于播放 |
AVAudioSessionCategoryRecord | 否 | 是 | 只用于录音 |
AVAudioSessionCategorySoloAmbient | 是 | 是 | 只用于播放 |
//听筒模式-(
void)setAudioSession{
AVAudioSession *audioSession=[
AVAudioSession sharedInstance];
//设置为播放和录音状态,以便可以在录制完之后播放录音 [audioSession setCategory:
AVAudioSessionCategoryPlayAndRecord error:
nil]; [audioSession setActive:
YES error:
nil];
}
//扬声器模式-(
void)setAudioWaiFangSession{
AVAudioSession *audioSession=[
AVAudioSession sharedInstance];
//设置为播放 [audioSession setCategory:
AVAudioSessionCategoryPlayback error:
nil]; [audioSession setActive:
YES error:
nil];
}
UIDeviceProximityStateDidChangeNotification用来监听手机是否贴近面部,即耳朵。
通知接收之后,可以根据[[UIDevice currentDevice] proximityState]
来得到为当前的接近状态,如果为 YES
则为接近(触发),否则为离开(未触发),需要的时候可以直接拿来用。