AVAudioSession 學習筆記

 

AVAudioSession類由AVFoundation框架引入。每一個iOS應用都有一個音頻會話。這個會話能夠被AVAudioSession類的sharedInstance類方法訪問,以下html

 
 
在得到一個AVAudioSession類的實例後,你就能經過調用音頻會話對象的setCategory:error:實例方法,來從IOS應用可用的不一樣類別中做出選擇。下面列出了可供使用的音頻會話類別[[AVAudioSession sharedInstance]

     setCategory: AVAudioSessionCategoryPlaybackios

     error: &setCategoryErr];session

//設置音頻是否啓用app

 [[AVAudioSession sharedInstance]框架

     setActive: YESide

     error: &activationErr];優化

 

 

 

AVAudioSessionCategorySoloAmbientui

 

這個類別很是像AVAudioSessionCategoryAmbient類別,除了會中止其餘程序的音頻回放,好比iPod程序。當設備被設置爲靜音模式,你的音頻回放將會中止。spa

 

 

AVAudioSessionCategoryRecord.net

這會中止其餘應用的聲音(好比iPod)並讓你的應用也不能初始化音頻回放(好比AVAudioPlayer)。在這種模式下,你只能進行錄音。使用這個類別,調用AVAudioPlayer的prepareToPlay會返回YES,可是調用play方法將返回NO。主UI界面會照常工做。這時,即便你的設備屏幕被用戶鎖定了,應用的錄音仍會繼續。

 

 

AVAudioSessionCategoryPlayback

 

 

這個類別會靜止其餘應用的音頻回放(好比iPod應用的音頻回放)。你可使用AVAudioPlayer的prepareToPlay和play方法,在你的應用中播放聲音。主UI界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放都會繼續。

 

 

 

AVAudioSessionCategoryPlayAndRecord

 

    這個類別容許你的應用中同時進行聲音的播放和錄製。當你的聲音錄製或播放開始後,其餘應用的聲音播放將會中止。主UI界面會照常工做。這時,即便屏幕被鎖定或者設備爲靜音模式,音頻回放和錄製都會繼續。

 

AVAudioSessionCategoryAudioProcessing

 

這個類別用於應用中進行音頻處理的情形,而不是音頻回放或錄製。設置了這種模式,你在應用中就不能播放和錄製任何聲音。調用AVAPlayer的prepareToPlay和play方法都將返回NO。其餘應用的音頻回放,好比iPod,也會在此模式下中止。

 

 

AVAudioSessionCategoryAmbient

這個類別不會中止其餘應用的聲音,相反,它容許你的音頻播放於其餘應用的聲音之上,好比iPod。你的應用的主UI縣城會工做正常。調用AVAPlayer的prepareToPlay和play方法都將返回YES。當用戶鎖屏時,你的應用將中止全部正在回放的音頻。僅當你的應用是惟一播放該音頻文件的應用時,靜音模式將中止你程序的音頻回放。若是正當iPod播放一手歌時,你開始播放音頻,將設備設爲靜音模式並不能中止你的音頻回放。

 

 

 

 

 

定製 Audio Session 的 Category

2016-07-26

本文內容主要來源於 Working with Categories

對於 Audio Session 來講,與之對應的 Category 是闡釋其音頻行爲的關鍵信息。好比:你的 App 的聲音是否應該受到手機的靜音鍵的控制、你的 App 使不使用音頻輸入或輸出、其餘音樂可否和你的 Audio 共存播放等等。

每一種 Category 都指定了是否支持下列這些能力:

  • Interrupts non-mixable apps audio:是否打斷不支持混音播放的應用。若是是,則當你的應用的音頻開始播放時,則那些不支持混音播放的應用的音頻會被打斷。
  • Silenced by the Silent switch:是否響應手機靜音鍵。若是是,則當手機靜音鍵被撥至靜音狀態時,你的音頻會被靜音。
  • Supports audio input:是否支持音頻輸入。若是是,你的應用就能夠錄音。
  • Supports audio output:是否支持音頻輸出。若是是,你的應用就能夠播放音頻。

下面是各類 Category 的能力表格:

Category 是否會被靜音鍵或鎖屏鍵靜音 是否打斷不支持混音播放的應用 是否容許音頻輸入/輸出
AVAudioSessionCategoryAmbient Yes NO 只輸出
AVAudioSessionCategoryAudioProcessing - YES 無輸入和輸出
AVAudioSessionCategoryMultiRoute NO YES 支持輸入和輸出
AVAudioSessionCategoryPlayAndRecord NO 默認 YES,可重寫開關置爲 NO 支持輸入和輸出
AVAudioSessionCategoryPlayback NO 默認 YES,可重寫開關置爲 NO 只輸出
AVAudioSessionCategoryRecord NO(鎖屏時依然保持錄製) YES 只輸入
AVAudioSessionCategorySoloAmbient YES YES 只輸出

大部分應用只須要在啓動時設置一下 Category 便可,不過你是能夠隨時修改 Audio Session 的 Category,也能夠隨時激活和關閉 Audio Session。當你的 Audio Session 是 Inactive 的,Category 的請求會在你激活它時發送,若是是 Active 的,則當即發送。

選擇最合適的 Category

每一種 Category 最準確的行爲定義是由系統控制而不是你的應用,蘋果可能會在未來從新定義不一樣的 Category 的行爲,因此你最好是選擇一種與你的應用使用音頻方式匹配的 Category 來用。

下面列一下各類 Category 的使用場景:

  • AVAudioSessionCategoryAmbient,只支持音頻播放。適用於把音頻做爲輔助性元素而非不可獲取特性的應用,使用這個 Category,你的音頻會被靜音鍵和鎖屏鍵靜音。

  • AVAudioSessionCategorySoloAmbient,這個是默認使用的 Category,只支持音頻播放。音頻會被靜音鍵和鎖屏鍵靜音。這個 Category 和 AVAudioSessionCategoryAmbient 的惟一不一樣在於它會打斷其餘應用的音頻播放。

  • AVAudioSessionCategoryPlayback,只支持音頻播放。你的音頻不會被靜音鍵和鎖屏鍵靜音。當你的應用把音頻播放做爲重要功能時,你可使用這個 Category。

有一點須要注意的是,當你選擇那些支持在靜音鍵切到靜音狀態以及鎖屏鍵切到鎖屏狀態下仍然支持你的音頻繼續播放的 Category 時,你必須在你的應用中開啓 Background Audio 的能力,詳見UIBackgroundModes。而且,一般你不該該經過 idleTimerDisabled 接口關閉系統的 Sleep Timer。若是你關閉了,那你應該把 idleTimerDisabled 置回 NO,以避免你的應用會禁止自動屏幕鎖定,畢竟鎖屏並不會影響你的音頻播放,你幹嗎關閉它呢。Sleep Timer 能夠確保你的屏幕在用戶無操做一段時間後自動變暗並鎖定來省電。

  • AVAudioSessionCategoryRecord,只支持音頻錄製。若是你的應用既要錄製還要播放,那你應該用 AVAudioSessionCategoryPlayAndRecord。
  • AVAudioSessionCategoryPlayAndRecord,支持音頻播放和錄製。音頻的輸入和輸出不須要同步進行,固然也能夠同步進行。對於音頻通話類應用,可使用這個 Category。
  • AVAudioSessionCategoryAudioProcessing,只支持離線音頻處理。支持離線音頻處理,而且不支持播放和錄製。
  • AVAudioSessionCategoryMultiRoute,支持音頻播放和錄製。容許多條音頻流的同步輸入和輸出。好比:USB 和耳麥同時音頻輸出。

除了 AVAudioSessionCategoryMultiRoute 外,其餘的 Category 都遵循 last in wins 原則,即最後接入的音頻設備做爲輸入或輸出的主設備。

使用 AVAudioSessionCategoryMultiRoute 來擴展音頻選擇

AVAudioSessionCategoryMultiRoute 並非簡單的遵循 last in wins 原則,AVAudioSessionCategoryMultiRoute 容許你的使用全部鏈接的輸出接口而不只是最後連上的接口。好比,當你正在經過 HDMI 輸出路徑聽音頻,這時又插上了耳麥,你的應用能夠同時在 HDMI 和耳麥都輸出音頻。

在 AVAudioSessionCategoryMultiRoute 下,你的應用能夠發送不一樣的音頻流到不一樣的輸出路徑。例如,你的應用能夠將一條音頻流發送到你的左耳麥,另外一條音頻流發送到右耳麥,並將第三條流發送到 HDMI 路徑。以下圖所示:

multiroute_output.png

AVAudioSessionCategoryMultiRoute 支持下列輸出組合:

  • USB + 耳麥
  • HDMI + 耳麥
  • LineOut + 耳麥

AVAudioSessionCategoryMultiRoute 支持單輸入接口。

設置 Audio Session Category

代碼以下:

  1. NSError *setCategoryError = nil;
  2. BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:&setCategoryError];
  3. // BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers error:&setCategoryError];
  4. if (!success) { /* handle the error in setCategoryError */ }

使用 Mode 來定製 Category

正如使用 Category 能夠定製應用的音頻行爲,咱們使用 Mode 則能夠定製 Category 的行爲。可選的 Mode 有這些:

Mode 兼容的 Category
AVAudioSessionModeDefault All
AVAudioSessionModeVoiceChat AVAudioSessionCategoryPlayAndRecord
AVAudioSessionModeGameChat AVAudioSessionCategoryPlayAndRecord
AVAudioSessionModeVideoRecording AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord
AVAudioSessionModeMoviePlayback AVAudioSessionCategoryPlayback
AVAudioSessionModeMeasurement AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayback
AVAudioSessionModeVideoChat AVAudioSessionCategoryPlayAndRecord

除了這些 Mode 外,有時在定製你的 Category 時,你還須要使用到一些 Option:

Option 說明 兼容的 Category
AVAudioSessionCategoryOptionMixWithOthers 容許和其餘音頻 mix AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute
AVAudioSessionCategoryOptionDuckOthers 智能調低衝突音頻音量 AVAudioSessionCategoryPlayAndRecord AVAudioSessionCategoryPlayback AVAudioSessionCategoryMultiRoute
AVAudioSessionCategoryOptionAllowBluetooth 容許藍牙音頻輸入 AVAudioSessionCategoryRecord AVAudioSessionCategoryPlayAndRecord
AVAudioSessionCategoryOptionDefaultToSpeaker 默認輸出音頻到揚聲器 AVAudioSessionCategoryPlayAndRecord
  • AVAudioSessionModeDefault,默認模式能夠與全部的 Category 兼容使用,並配置設備用於通常用途。

  • AVAudioSessionModeVoiceChat,通常用於 VoIP 類型的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord Category。在這個模式下,用於音頻的信號會由系統提供的信號處理程序優化,而且這個模式會配置上 AVAudioSessionCategoryOptionAllowBluetooth 這個選項。這個設置下,當系統內置麥克風被使用時,系統會自動選擇最佳內置麥克風組合支持語音聊天,從而優化語音聊天體驗。

  • AVAudioSessionModeVideoChat,通常用於視頻聊天應用,好比 FaceTime。這個模式只用於 AVAudioSessionCategoryPlayAndRecord Category。在這個模式下,用於音頻的信號會由系統提供的信號處理程序優化,而且這個模式會配置上 AVAudioSessionCategoryOptionAllowBluetooth 和 AVAudioSessionCategoryOptionDefaultToSpeaker 選項。這個設置下,當系統內置麥克風被使用時,系統會自動選擇最佳內置麥克風組合支持視頻聊天,從而優化視頻聊天體驗。

蘋果推薦音頻或視頻聊天應用也使用 Voice-Processing I/O Unit,這個模塊提供了一系列的特性來支持 VoIP 類應用。

  • AVAudioSessionModeGameChat,通常用於遊戲類應用。使用 GKVoiceChat 對象的應用會自動設置這個模式和 AVAudioSessionCategoryPlayAndRecord Category。這個模式使用的路徑參數和 AVAudioSessionModeVideoChat 一致。

  • AVAudioSessionModeVideoRecording,通常用於須要使用攝像頭採集視頻的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord 和 AVAudioSessionCategoryRecord 這兩個 Category。在這個模式下,信號會被系統提供的信號處理程序修改。這個模式與 AVCaptureSession API 結合來用能夠更好地控制音視頻的輸入輸出路徑。好比,經過設置 automaticallyConfiguresApplicationAudioSession 屬性可讓系統根據所使用的設備自動選擇最佳輸出路徑。

  • AVAudioSessionModeMeasurement,通常用於那些要最小化系統自帶的音視頻信號處理流程對信號的影響的應用。這個模式只用於 AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryRecord、AVAudioSessionCategoryPlayback 這幾種 Category。輸入信號由設備的主麥克風來路由。

  • AVAudioSessionModeMoviePlayback,通常用於播放電影或其餘視頻的應用。這個模式只用於 AVAudioSessionCategoryPlayback Category。

支持 AirPlay 的 Category 和 Mode

如下 Category 支持「鏡像」和「非鏡像」版本的 AirPlay:

  • AVAudioSessionCategorySoloAmbient
  • AVAudioSessionCategoryAmbient
  • AVAudioSessionCategoryPlayback

此外:

  • AVAudioSessionCategoryPlayAndRecord 只支持「鏡像」版本的 AirPlay。

Mode 只有在和 AVAudioSessionCategoryPlayAndRecord Category 配合使用時才支持 AirPlay,下面的 Mode 只支持「鏡像」版本的 AirPlay:

  • AVAudioSessionModeDefault
  • AVAudioSessionModeVideoChat
  • AVAudioSessionModeGameChat

Category 使用調優

你能夠有多種方式來調優 Category,下面舉幾個例子:

  • 容許其餘 App 的音頻與你的音頻 mix 在一塊兒播放。你能夠改寫 AVAudioSessionCategoryPlayback、AVAudioSessionCategoryPlayAndRecord、AVAudioSessionCategoryMultiRoute 這些 Category 的中斷特性。改寫時,你須要應用 AVAudioSessionCategoryOptionMixWithOthers 選項到你的 Audio Session。若是你的應用是 mixable 的,當一個 non-mixable 應用的 Audio Session 被激活時,你的應用不會中斷它的音頻。一樣,你的應用的音頻在播放時也不會被其餘 non-mixable 的應用中斷。
  • 將音頻輸出路徑從聽筒改到揚聲器。當你使用 AVAudioSessionCategoryPlayAndRecord 這個 Category 時,音頻默認是從聽筒輸出的,你能夠經過 overrideOutputAudioPort:error: 方法將音頻輸出路徑改到揚聲器。
  • 當你的音頻播放時,你能夠強制其餘的音頻下降音量。這時候你須要將 AVAudioSessionCategoryOptionDuckOthers 應用到你的 Category 上,使用這個特性的應用須要管理本身的 Audio Session,在播放音頻前激活 Audio Session,在播放完成後關閉 Audio Session。

音頻錄製權限申請

從 iOS7 以後,錄製音頻的權限須要用戶受權才能得到。若是用戶不給你權限,那麼你錄製的就是靜音。當你使用一個須要錄製權限的 Category 來定製你的 Audio Session 時,系統會自動彈出權限申請提示給用戶。

除了讓系統自動彈出權限申請提示外,你還能夠經過 requestRecordPermission: 方法來向用戶請求權限。

相關文章
相關標籤/搜索