天天看點

Audio Session Programming Guide

Audio Session:自己開發的應用和IOS應用程式處理的中介,你的應用啟動,會産生一個單例的Audio Session,通過配置它來處理你應用的用途。

audio session category:is a key that identifies a set of audio behaviors for your application.通過定義你category告知系統你的應用的意圖,比如鎖屏時候,是否需要繼續播放音樂。有六個category,通過開關設定(YES OR NO)來控制你應用的行為。

audio session是在應用程式啟動自動激活的。

audio session預設的行為:

播放功能啟用和錄音功能禁用。

當使用者移動靜音開關(iPhone上的響鈴/靜音開關)的“沉默”的位置,您的音頻靜音。

當使用者按下“睡眠/喚醒“按鈕,在螢幕鎖定或自動鎖定期限屆滿時,您的音頻靜音。

您的音頻開始時,其他音頻裝置,如iPod的音頻已經沉默。

以上這些行為被封裝在AVAudioSessionCategorySoloAmbient類中,預設的category往往不是我們需要的。

預設的設定不适合的幾種場景:

1:你聽着音樂,過了一段時間,系統自動鎖屏,音樂靜音,這是需要設定category的AVAudioSessionCategoryPlayback。

2:確定iPod音樂是沒有被中斷,配置您的audio session允許混合。使用AVAudioSessionCategoryAmbient

3:寫了一個視屏播放程式,當使用者看視訊看到一半的時候,突然來了一個電話,使用者處理完成之後,點選播放按鈕,就沒有效果,必須得重頭播放。這時候的處理就是寫一個回調方法,繼續剛才的視訊。

Audio Session處理有兩個API:

1:AVAudioSession類,用objective-c實作,使用這個API有兩個優勢,第一擷取Audio Session的單例和C的API一樣。第二你可以利用簡單的委托方法處理音頻中斷和改變硬體配置,如采樣率和信道數。你可以使用這些委托方法不管你使用音頻技術為播放,錄音,或處理。

2:Audio Session Services:是用C寫的一個一個類,提供對所有的基本和進階特性的操作。

這兩個API是互相相容的,可以同時使用。

使用模拟器,以下幾個方式是不行的:

1:調用中斷

2:更改靜音開關的設定

3:模拟螢幕鎖定

4:模拟插上或拔下耳機

5:Query audio route information or test audio session category behavior

6:音頻的混合測試(同時ipod和你的應用)

配置audio session:

初始化audio session:使用 AV Foundation framework來進行中斷,蘋果推薦使用隐士的初始化session,當你在處理AVAudioSession,AVAudioPlayer,AVAudioRecorder這些類的代理方法時候。

當然你也可以用C寫一個回調函數來進行中斷。

一般會在應用啟動的時候初始化session,一般也在viewDidLoad中寫初始化代碼,系統在鬧鐘,電話,月曆等提醒音時候會禁用session,然後處理完之後又開啟。蘋果建議使用AVAudioSessionDelegate的代理類來reactive(重新激活)session。

蘋果的六個audio session category作用:

1:Three for playback

2:One for recording

3:One that supports playback and recording—that need not occur simultaneously

4:One for offline audio processing

以下是六個category:

1:AVAudioSessionCategoryAmbient(或者使用kAudioSessionCategory_AmbientSound)

2:AVAudioSessionCategorySoloAmbient(或者使用kAudioSessionCategory_SoloAmbientSound)

3:AVAudioSessionCategoryPlayback(或者使用kAudioSessionCategory_MediaPlayback)

4:AVAudioSessionCategoryRecord(或者使用kAudioSessionCategory_RecordAudio)

5:AVAudioSessionCategoryPlayAndRecord(或者使用kAudioSessionCategory_PlayAndRecord)

6:AVAudioSessionCategoryAudioProcessing(或者使用kAudioSessionCategory_AudioProcessing)

可以在viewdidiload方法中檢視這些屬性的值。

Audio Session Category最好在啟動的時候設定,然後不要改變它。

Audio中斷的處理方式:

1:使用AV Foundation framework裡面定義的delegate方法處理

2:使用C語言的回調函數處理

What needs to happen during an audio session interruption

[img]http://dl.iteye.com/upload/attachment/0082/9310/a4993cc5-7592-36ca-99f1-305f8ce2cdf5.png[/img]

進行中斷的技術:

1:AV Foundation framework的AVAudioPlayer和AVAudioRecorder類

2:Audio Queue Services, I/O audio unit

3:OpenAL

4:System Sound Services

An audio session gets interrupted

[img]http://dl.iteye.com/upload/attachment/0082/9313/9a2e79e1-c4f4-3122-8302-47cb5276a874.png[/img]

AVAudioSessionDelegate的兩個方法來處理:beginInterruption和endInterruption

AVAudioRecorder和AVAudioPlayback的代理也提供

audioPlayerBeginInterruption、 audioPlayerEndInterruption、audioRecorderBeginInterruption、audioRecorderEndInterruption

使用c語言的回調來進行中斷

An audio hardware route:是一個有線電子通道的音頻信号,類似耳機拔插或者介入其他硬體裝置

audio session API可以指定硬體的采樣頻率和I/O緩沖區。已到達優化的作用,設定屬性AudioSessionSetProperty值kAudioSessionProperty_PreferredHardwareSampleRate和kAudioSessionProperty_PreferredHardwareIOBufferDuration,最好是在inactive狀态就設定好了

[img]http://dl.iteye.com/upload/attachment/0083/0269/ca7b547b-b1cf-3180-a567-c3d97428f67e.png[/img]

可以查詢硬體的特征,通過通路屬性kAudioSessionProperty_-

CurrentHardwareSampleRate、kAudioSessionProperty_-

CurrentHardwareOutputVolume、kAudioSessionProperty_-

CurrentHardwareOutputLatency、kAudioSessionProperty_-

AudioInputAvailable,這些屬性改變時候都會有事件,可以自定義callback函數處理

處理音樂和視訊

ipod音樂:MPMusicPlayerController類,是系統預設的一個audio session

視訊:MPMoviePlayerController類,是系統預設的一個audio session,但是要設定useApplicationAudioSession為NO。

它們都需要配置audio session

Configuring audio sessions when using a movie player

[img]http://dl.iteye.com/upload/attachment/0083/0284/c327a264-4141-3b4d-97c8-333ba1678fc0.png[/img]

附件是sample code