使用Audio Queue Services 播放和錄製音頻

from http://blog.csdn.net/weiqubo/article/details/7733231

要在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

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章