ios AVAudioSession 音视频

之前觉得ios 嘛,音视频既然和硬件有一定关系的话,那么就苹果怎么规定就怎么写喽,但是一切都是从小事情做起的,如果那天去面试直接这样子说,那么对“技术”的不屑一顾自然也会被面试官不屑一顾,那么就跟随我一起来探秘下苹果给我们的接口


iOS给出的解决方案是"AVAudioSession" 


Session默认行为

1.可以进行播放,但是不能进行录制。

2.当用户将手机上的静音拨片拨到“静音”状态时,此时如果正在播放音频,那么播放内容会被静音。

3.当用户按了手机的锁屏键或者手机自动锁屏了,此时如果正在播放音频,那么播放会静音并被暂停。

4.如果你的App在开始播放的时候,此时QQ音乐等其他App正在播放,那么其他播放器会被静音并暂停。

默认的行为相当于设置了Category为“AVAudioSessionCategorySoloAmbient”,硬件只有一个,那么有必要限控制访问的个数。

虽然系统会在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;
这里的options传入 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 则为接近(触发),否则为离开(未触发),需要的时候可以直接拿来用。





猜你喜欢

转载自blog.csdn.net/georgehenrywilliam/article/details/80283598