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