要在iOS裝置上播放和錄製音頻,蘋果推薦我們使用AVFoundation架構中的AVAudioPlayer和AVAudioRecorder類。雖然用法比較簡單,但是不支援流式;這就意味著:在播放音頻前,必須等到整個音頻載入完成後,才能開始播放音頻;錄音時,也必須等到錄音結束後,才能擷取到錄音資料。這給應用造成了很大的局限性。為瞭解決這個問題,我們就需要使用Audio Queue Services來播放和錄製音頻;為了簡化音頻檔案的處理,這裡還需要用到Audio
File Services(以前以為C語言沒有音頻檔案處理的函數庫,現在找到了)。
在使用之前,我們需要瞭解AudioQueue Service的基本工作原理。
圖1一個錄音音頻隊列(Recording Audio Queue)
由可以得知,一個Recording Audio Queue,包括Buffer(緩衝器)組成的Buffer Queue(緩衝隊列),以及一個Callback(回調)。他們之間是如何工作的呢?
圖2 錄音流程
1. 將音頻填入第一個緩衝器中
2. 當隊列中的第一個緩衝器填滿時,會自動填滿下一個緩衝器。此時,會觸發回調。
3. 在回呼函數中需要將音頻資料流寫入磁碟
4. 然後,需要在回呼函數中將該緩衝器重新放入緩衝隊列,以便重複使用該緩衝器。重複步驟2。
在瞭解錄音的流程之後,讓我們來看看播放基本體繫結構。
圖3 一個播放音頻隊列(A playback audio queue)
由可以得知,其結構和錄音音頻隊列基本一致,只是回調觸發的時機不同,工作流程略有差異。
圖4 播放流程
1. 將音頻讀入到緩衝器中。一旦填充滿一個緩衝器,就會進入緩衝隊列,此時處於待命狀態。
2. 應用程式命令發出指令,要求音頻隊列開始播放。
3. 音頻會從第一個緩衝器中取資料,並開始播放。
4. 一旦播放完成,就會觸發回調,並開始播放下一個緩衝器中的內容。
5. 回調中需要給該緩衝器取後面的音頻資料,然後重新放入緩衝隊列中。重複步驟3。
至此,Audio QueueServices的基本原理就算介紹完了。在實際的應用中,還需要處理好各種狀態,以及異常情況,例如播放中斷、沒有錄音裝置等。關於Audio File Services 的使用,我這裡就不做介紹了,詳細參考源碼。
與本文配套的原始碼樣本:http://download.csdn.net/detail/midfar/4044390
參考資料:
Audio Queue Services Programming Guide
https://developer.apple.com/library/ios/#documentation/MusicAudio/Conceptual/AudioQueueProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40005343
Audio Queue Services Reference
https://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/AudioQueueReference/Reference/reference.html#//apple_ref/doc/uid/TP40005117
Audio File Services Reference
https://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/AudioFileConvertRef/Reference/reference.html#//apple_ref/doc/uid/TP40006072