iOS AudioSession的Category如何选择
1.kAudioSessionCategory_AmbientSound 或 AVAudioSessionCategoryAmbient
使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,也不会被其他应用播放声音中止,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音,即使应用开机了Background Modes audio,AirPlay and Picture in Picture模式
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
2.kAudioSessionCategory_SoloAmbientSound 或 AVAudioSessionCategorySoloAmbient
使用这个category的应用会中止其他应用播放声音,并且会随着静音键和屏幕关闭而静音。该category就是AVAudioPlayer默认的category。注意:该Category无法在后台播放声音,即使应用开机了Background Modes audio,AirPlay and Picture in Picture模式
UInt32 sessionCategory = kAudioSessionCategory_SoloAmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
3.kAudioSessionCategory_MediaPlayback 或 AVAudioSessionCategoryPlayback
使用这个category的应用,会中断其他应用播放声音,其他应用的播放也会中断它的声音播放,不会随着静音键和屏幕关闭而静音。注意:可以在后台播放声音,但是要主动去开启Background Modes Audio,Airplay and Picture in Picture模式
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
4. kAudioSessionCategory_RecordAudio 或 AVAudioSessionCategoryRecord
该category用于需要录音的应用,设置该category后,除了来点铃声,闹钟或日历提醒之外的其他系统声音都不会被播放。这个category只提供单纯录音功能。注意,这个时候我发现,手机系统的音量增减都没有效果了。
UInt32 sessionCategory = kAudioSessionCategory_RecordAudio;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
5. kAudioSessionCategory_PlayAndRecord 或 AVAudioSessionCategoryPlayAndRecord
该category用于既需要播放声音又需要录音的应用。如果我们的应用需要用到iPhone上的听筒,那么这个category是我们唯一的选择,在该category下声音的默认出口为听筒(在没有外接设备的情况下)。当然如果我们想要使用这个category,但是又要声音从扬声器播放出来,那么我们可以去修改AudioSession的kAudioSessionProperty_OverrideAudioRoute属性为kAudioSessionOverrideAudioRoute_Speaker。但是如果不使用了这个category就不能让声音去听筒播放。再必要的需求时,必须去主动切换AudioSession的category。
默认情况下:
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
让声音从扬声器播放出来:
UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride),
&audioRouteOverride);
注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。