本文轉自:[AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com][2] 本文內容主要來源於 [Responding to Interruptions][3]。 當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放 ...
本文轉自:AVAudioSession(4):響應音頻中斷事件 | www.samirchen.com
本文內容主要來源於 Responding to Interruptions。
當一個音頻中斷到來時,會關閉你的 Audio Session,這通常就意味著停止或暫停你的音頻播放。產生中斷通常是因為另一個和你的應用存在競爭性音頻行為的應用此時被激活,而這個應用設置的 Category 不支持 mix 你的音頻。正確的處理音頻中斷事件能夠讓你的應用提供給用戶更好的體驗。
當用戶電話響起的時候,你的應用還會因中斷而被掛起。當電話結束,你的應用才會被繼續運行。這時你的 Audio Session 需要被重新激活。
音頻中斷處理技術
你可以通過監聽音頻中斷相關的通知 AVAudioSessionInterruptionNotification 來處理中斷事件。
當音頻中斷發生時,你應該做的事情大致如下:
- 中斷開始後
- 1)保持狀態和上下文;
- 2)更新用戶界面。
- 中斷結束後
- 1)恢復狀態和上下文;
- 2)在應用準備好時激活 Audio Session;
- 3)更新用戶界面。
根據使用的音頻技術不同,相應的處理中斷的技術也會有所差別,大致如下:
AV Foundation framework
:AVAudioPlayer 類和 AVAudioRecorder 類提供了中斷開始和結束的 Delegate 回調方法來供你處理中斷。你可以實現這些回調方法來在對應的時候更新你的用戶界面,以及在中斷結束後恢復播放。使用這兩個類播放或錄製音頻,當發生中斷時,系統會自動暫停播放或錄製,在中斷結束時,當你恢復播放或錄製時,系統會自動激活你的 Audio Session。如果你想要在應用退出/啟動時,記錄/恢復播放位置,那麼在發生中斷時,你也要記得記錄一下播放位置。Audio Queue Services, I/O audio unit
:這些技術需要你的應用自己來處理中斷,你需要負責記錄播放或錄製的位置,以便在中斷結束恢復 Audio Session 時用到。OpenAL
:當使用 OpenAL 播放時,你需要註冊對應的通知事件來監聽中斷。並且你還需要自己管理 OpenAL 的上下文。System Sound Services
:使用 System Sound Services 播發音頻,當中斷發生時,音頻播放會靜音,當中斷結束後,音頻播放會恢復。你的應用則無法影響音頻中斷時的行為。
中斷的生命周期
音頻中斷發生的過程大致如下圖所示:
- 1)你的應用正在運行,在播放音頻。
- 2)來了一個電話。系統激活電話應用的 Audio Session。
- 3)系統關閉你的 Audio Session。這時,你的應用里的音頻播放被停止了。
- 4)系統調用你應用的中斷監聽回調方法,通知你:你的 Audio Session 已經被關閉了。
- 5)你的回調方法做出合適的處理,比如:更新用戶界面,保持當前狀態信息和上下文以便於恢復播放時用。
- 6)當用戶解除中斷,比如掛掉了電話,系統會調用你的回調方法,通知你:中斷結束了。
- 7)你的回調方法做出合適的處理,比如:更新用戶界面,重新激活 Audio Session,恢復播放。
- 8)如果在 6 中用戶沒有解除中斷,比如接聽了電話,系統會將你的應有掛起,當通話結束後,中斷結束的消息會通知給你。
需要註意的是,有一個中斷開始消息不一定會有一個中斷結束消息,這就意味著你在中斷結束的回調里的處理邏輯可能會沒有被執行到。所以你的應用需要關註當切到前臺運行狀態時或者用戶點擊了播放按鈕時,是不是需要重新激活你的 Audio Session,因為有可能這時候你的 Audio Session 還因為一次有開始通知沒結束通知的中斷給關閉著呢。