iOS 音頻開發之CoreAudio


 

        接觸過IOS音頻開發的同學都知道,Core Audio 是IOS和 MAC 的關於數字音頻處理的基礎,它提供應用程序用來處理音頻的一組軟件框架,所有關於IOS音頻開發的接口都是由Core Audio來提供或者經過它提供的接口來進行封裝的,按照官方的說法是集播放,音頻處理錄制為一體的專業技術,通過它我們的程序可以同時錄制,播放一個或者多個音頻流,自動適應耳機,藍牙耳機等硬件,響應各種電話中斷,靜音,震動等,甚至提供3D效果的音樂播放。

Core Audio 的API結構分三層,如下圖:

 

                                       322db00a7899e84f24273434cdb12ab4.jpeg  

 

 

 

Low-Level 層是關於硬件接口的API層,這個層次的API主要是提供給MAC用來編寫需要實時性能音頻處理的接口,一般的應用程序都不會使用這一層次的API,Core Audio為IOS這個移動平台提供了一個更高層次的API來處理實時音頻,這個API更加緊湊,高效。

 

 Mid-Level 層的功能比較齊全,包括音頻數據格式轉換,音頻文件讀寫,音頻流解析,插件工作支持等

Audio Convert Services API  負責音頻數據格式的轉換

 

Audio File Services API 負責音頻數據的讀寫

Audio Unit Services 和 Audio Processing Graph Services 支持均衡器和混音器等數字信號處理的插件。

Audio File Scream Services 負責流解析

Core Audio Clock Services 負責音頻音頻時鍾同步

 

High-Level層是一組從低層接口組合起來的高層應用,基本上我們很多關於音頻開發的工作在這一層就可以完成

Audio Queue Services 提供錄制、播放、暫停、循環、和同步音頻它自動采用必要的編解碼器處理壓縮的音頻格式。

 

AVAudioPlayer是專為IOS平台提供的基於Objective-C接口的音頻播放類,可以支持iOS所支持的所有音頻的播放。

OpenAL是CoreAudio對OpenAL標准的實現,可以播放3D混音效果。


 

CoreAudio 的API並不是封裝成一個單獨的framework,它的接口散落到不同的framework,例如:

 

    AudioToolbox.framework提供coreAudio的中高級別的API服務,我們經常會打交道的AVAudioSession類就是包含在這個庫中,用來處理應用程序的關於音頻設備上下文的控制。通過它可以設置程序的音頻能力,處理電話和其他高優先級語音處理而導致的中斷和恢復操作等。

    AudioUnit.framework這個庫提供DSP數字信號處理相關的插件,包括編解碼,混音,音頻均衡等。

    AVFoundation.framework這個庫提供一個精簡的音樂播放類,可以播放所有IOS支持的音頻。

OpenAL.framework提供3D音效播放

 
 

CoreAudio在設計上主要采用屬性對機制來管理和操作音頻對象的狀態和行為,我們在各個類中都能看這樣的工作方式:

 

      1、一個屬性KEY通常是一個助記名字定義的枚舉常量,比如 kAudioFilePropertyFileFormat或kAudioQueueDeviceProperty_NumberChannels。

2、一個屬性value 通常是一個特定的適合於描述該屬性的數據類型,例如void *,aFloat64,一個AudioChannel 數據結構等

 

CoreAudio通過訪問函數來獲取Key 對應的屬性值,如果該屬性值可寫的話,還可以通過Key來修改key對應的屬性,當然,CoreAudio也提供普通的接口來獲取對象的值。例如通過kAudioSessionProperty_OverrideCategoryDefaultToSpeaker來設置程序音頻切換成外放模式

   UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; 

AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(audioRouteOverride), &audioRouteOverride);

 

CoreAudio接口提供一個回調機制在音頻對象的某個屬性變化時候通知你的應用程序,應用程序在使用AudioQueue類進行音樂播放的時候,實現這個回調函數,並且設置給AudioQueue對象,那么AudioQueue對象在執行完音頻播放操作之后調用該函數。

 
            

typedef void    (*AudioQueuePropertyListenerProc) (

                    void *                  inUserData,

                    AudioQueueRef           inAQ,

                    AudioQueuePropertyID    inID

                );


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM