標籤:後台 異常 ssi war -o flags details values 自己
轉coco-LG
audiosession負責調節你的app和ios系統裡的音頻行為.一旦載入了audiosession你可以獲得一個audiosession的單例.你可以配置這個audiosession來控制你的app的音頻行為.例如:
- 當你的app播放聲音的時候,你是希望其他現正播放聲音的app靜音還是混合兩個app的聲音?
- 你的app如何回應突發的打斷,例如這時候鬧鈴突然響了?
- 你的app又該如何回應耳機口的拔插呢?
AuioSession的配置會影響你的app在運行中所有的音頻活動,除了利用System Sounds Services API控制的音頻.
你還可以利用AudioSession來檢測你所用硬體的參數,例如聲道和採樣率.
你還可以隨時啟用或者停止你的audioSession,當你的app播放聲音或者正在錄音的時候,你必須確保AudioSession處於啟用狀態.
系統也有權利隨時中斷你的audioSession,例如,當你來電話的時候.當然,AudioSession提供了api來讓你的app從這種中斷中恢複.
一、執行個體化
[objc] view plain copy
- AVAudioSession *audioSession = [AVAudioSession sharedInstance];
可以看出AVAudioSession是個單例對象。
二、類別設定
在獲得一個AVAudioSession類的執行個體後,你就能通過調用音頻會話對象的setCategory:error:執行個體方法,來從IOS應用可用的不同類別中作出選擇。類別分為一下幾種:
[objc] view plain copy
- #pragma mark -- Values for the category property --
-
- /* Use this category for background sounds such as rain, car engine noise, etc.
- Mixes with other music. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAmbient;
-
- /* Use this category for background sounds. Other music will stop playing. */
- AVF_EXPORT NSString *const AVAudioSessionCategorySoloAmbient;
-
- /* Use this category for music tracks.*/
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayback;
-
- /* Use this category when recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryRecord;
-
- /* Use this category when recording and playing back audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryPlayAndRecord;
-
- /* Use this category when using a hardware codec or signal processor while
- not playing or recording audio. */
- AVF_EXPORT NSString *const AVAudioSessionCategoryAudioProcessing NS_DEPRECATED_IOS(3_0, 10_0) __TVOS_PROHIBITED __WATCHOS_PROHIBITED;
1.AVAudioSessionCategoryAmbient
用於非以語音為主的應用,使用這個category的應用會隨著靜音鍵和螢幕關閉而靜音。並且不會中止其它應用播放聲音,可以和其它內建應用如iPod,safari等同時播放聲音。注意:該Category無法在背景播放聲音 2.AVAudioSessionCategorySoloAmbient 類似於AVAudioSessionCategoryAmbient不同之處在於它會中止其它應用播放聲音。 這個category為預設category。該Category無法在背景播放聲音 3.AVAudioSessionCategoryPlayback 用於以語音為主的應用,使用這個category的應用不會隨著靜音鍵和螢幕關閉而靜音。可在背景播放聲音 4.AVAudioSessionCategoryRecord 用於需要錄音的應用,設定該category後,除了來電鈴聲,鬧鐘或日曆提醒之外的其它系統聲音都不會被播放。該Category只提供單純錄音功能。 5. AVAudioSessionCategoryPlayAndRecord 用於既需要播放聲音又需要錄音的應用,語音交談應用(如)應該使用這個category。該Category提供錄音和播放功能。如果你的應用需要用到iPhone上的耳機,該category是你唯一的選擇,在該Category下聲音的預設出口為耳機(在沒有外接裝置的情況下)。 注意:並不是一個應用只能使用一個category,程式應該根據實際需要來切換設定不同的category,舉個例子,錄音的時候,需要設定為AVAudioSessionCategoryRecord,當錄音結束時,應根據程式需要更改category為AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一種。
三、恢複外部音樂
從上面的類別可以看出,在錄音或播音的的時候是會關閉外部現正播放的音頻。比如發語音的時候,現正播放的音樂會停止。但是錄完之後需要讓外部音效繼續播放。這個需要手動設定:
[objc] view plain copy
- [[AVAudioSession sharedInstance] setActive:NO
- withFlags:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation
- error:nil];
這裡需要注意一個問題,如果在錄音或播音前本來就沒有外部音效播放,直接執行這一句會使cocos2d裡面的部分音效異常。所以,在開始錄音或播音之前先判斷一下是否有外部音效播放,然後用一個標誌位記錄,在錄音或播音完成之後對這個標誌位做判斷,如果有外部音效,則執行上邊的代碼去恢複外部音效。下面是判斷外部音效的代碼:
[objc] view plain copy
- -(BOOL) isOtherAudioPlaying {
- UInt32 isPlaying = 0;
- UInt32 varSize = sizeof(isPlaying);
- AudioSessionGetProperty (kAudioSessionProperty_OtherAudioIsPlaying, &varSize, &isPlaying);
- return (isPlaying != 0);
- }
四、協調當前應用的背景音效
如果當我們遇到這樣一種情況:自己的應用有背景音樂,這時候需要錄音,錄完音還要恢複播放背景音樂。這個只需要再設定一次背景音樂的類別,一般背景音樂都是系統預設類別:
[objc] view plain copy
- [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
五、注意點
1.如果在錄音或播音前本來就沒有外部音效播放,直接執行這一句會使cocos2d裡面的部分音效異常。所以,在開始錄音或播音之前先判斷一下是否有外部音效播放,然後用一個標誌位記錄,在錄音或播音完成之後對這個標誌位做判斷,如果有外部音效,則執行上邊的代碼去恢複外部音效;
2.有背景音樂的時候執行“恢複外部音樂”出現警告Deactivating an audio session that has running I/O
具體講解請參考:http://blog.csdn.net/gang544043963/article/details/53323270
AVAudioSession應用指南