你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> Audio Session Programming Guide(官方文檔翻譯一)

Audio Session Programming Guide(官方文檔翻譯一)

編輯:IOS開發基礎

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從這種中斷中恢復.

AudioSession的默認行為

AudioSession有一些默認的行為和規則.特別是以下幾點.

  • 當app正在播放聲音時,是不能錄音的.

  • 當用戶把靜音鍵撥到靜音的位置時,你的音頻將會靜音

  • 當用戶鎖定屏幕或者手機自動進入鎖屏模式的時候你的音頻將會靜音

  • 當你的音頻開始的時候,設備的其他正在播放的音頻將會靜音

以上所有的行為都是由一個默認的Audio Session類別控制的,AudioSessionCategorySoloAmbient.

當你播放或者錄制音頻的時候你的AudioSession就會自動啟動.然而,依賴這些默認的配置可能會產生很多問題.比如,當你的手機接到電話,那麼你的音頻有可能不會播放,因為這決定於你使用哪種方式播放音頻.

你當然可以從默認的AudioSession配置中獲得很好的效果.但是,需要記住的是,對於一個上架的app來說.只有兩種情形適用於使用默認的配置.

  • 你的app只使用System Sound Services 或者UIKIt中的 playInputClick方法來播放音頻.

  • 你的app完全不使用任何音頻

其他任何環境,都不要使用默認的AudioSession配置.

為什麼一個默認的AudioSession配置通常並不是你想要的

如果你不顯示的初始化,配置你的AudioSession,那麼你就不能正確的處理系統的中斷或者硬件路徑的更改(例如耳機和功放的切換).而且,你的app對於系統決定不同app之間同時播放音頻這種情況也毫無控制力.

以下是幾種使用默認AudioSession配置可能導致的問題,以及你需要怎麼做才能避免.

  • 場景1.你寫了一個語音圖書的app,當用戶正在聽一個故事的時候,手機的自動鎖屏時間到了.用戶的屏幕鎖住了,那麼你的audio也自動靜音了.

為了確保音頻會在視頻鎖屏時繼續播放,你需要配置你的AudioSession讓他支持繼續播放,在UIBackgroundModes中開啟audio flag.

  • 場景2.你寫了一個第一人稱射擊游戲,游戲的音效是基於OpenAL的.並且你為玩家提供了一個功能,這個功能就是玩家可以關閉游戲提供的默認音效並且選擇一首自己手機裡的歌曲作為替代.然而,當玩家射擊了敵軍的一艘飛船時,音樂停止了.

為了確保音樂不會停止,你需要配置你的AudioSession使他允許混音,使用AVAudioSessionCategoryAmbient這個類別,或者修改AVAudioSessionCategoryPlayback這個類別使他支持混音.

  • 場景3.你使用Audio Queue Services寫了一個流媒體播放app,當用戶正在使用app時,一個電話來了,鈴聲打斷了你的app.當用戶選擇忽略這個電話並且關掉鈴聲.當用戶重新點擊Play按鈕繼續收聽音樂,這時,什麼都沒發生,音樂並沒有繼續播放.用戶不得不從後台關掉你的ap並且重新啟動它.(我如果碰到這種app肯定直接刪掉了.)

為了解決這種中斷audio queue的情況,你必須設置優先級,並且注冊AVAudioSessionInterruptionNotification.以使你的app正確的響應.

系統如何處理音頻資源的爭奪

當你的iOS app啟動的時候,很多系統內置的app,例如信息,音樂播放器,safari,電話.可能都在後台運行,其中的任意一個都有可能在制造audio,例如,新信息來的時候,你十分鐘前啟動的podcast任然在播放.諸如此類.

如果你把你的iOS設備看做一個飛機場,每一個app都看做一個飛機,那麼操作系統可以被看做一個調度塔,用來控制每個音頻的調度順序.如圖.

1.jpg

需要記住的是,系統永遠遵循一個原則,就是電話的優先級最高.

使用AVCaptureSession

AVFoundation框架(AVCaptureDevice,AVCaptureSession)允許你同步的使用麥克分和攝像頭捕捉音頻和視頻.在iOS7系統,AVCaptureDevice對象,例如麥克風可以共享你的AVAudioSession配置.默認情況下,AVCaptureSession會優化你的AVAudioSession以便於使用麥克風錄制音頻.如果把automaticallyConfiguresApplicationAudioSession這個屬性設置為NO,那麼AVCaptureDevice不會修改你AVAudioSession的當前設置.

初始化你的Audio Session

系統在你的app加載之前就提供了一個audio session.但是,你任然需要初始化一個session用來處理各種中斷事件.

AVFoundation Framework利用一個隱式的初始化方法來獲取中斷.你可以這樣獲取一個AVAudioSession的實例.

// implicitly initializes your audio session
AVAudioSession *session = [AVAudioSession sharedInstance];

變量session就代表了一個初始化的audio session,你可以直接使用.你可以使用AVAudioSession這個類提供的中斷通知來處理各種音頻的中斷事件.並且系統提供了AVAudioPlayer和AVAudioRecorder的代理.

添加音量控制和路徑控制

使用MPVolumeView類可以顯示聲音和路徑控制.音量view提供了一個滑動條去控制音量大小.並且提供了一個按鈕來選擇音頻輸出的路徑.蘋果推薦使用MPVolumeView選擇音頻的出口.

遠程控制

當你的app處於正在播放狀態的時候,你可以遠程控制你的app.詳情查閱.Remote Control Events和MPNowPlayingInfoCenter Class Reference

激活和關閉你的AudioSession

系統雖然會在你的app加載的時候就激活你的audiosession.但是蘋果還是推薦你顯式的在你的viewDidLoad裡激活你的audiosession.

NSError *activationError = nil;
BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
if (!success) { /* handle the error in activationError */ }

檢測app加載的時候是否有其他音頻正在播放

使用otherAudioPlaying 屬性可以檢測是否有其他音頻正在播放.

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved