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中的一种。