iOS 和 OS X 平臺(tái)都有一系列操作音頻的 API,其中涵蓋了從低到高的全部層級。隨著時(shí)間的推移、平臺(tái)的增長以及改變,不同 API 的數(shù)量可以說有著非常巨大的變化。本文對當(dāng)前可以使用的 API 以及它們使用的不同目的進(jìn)行簡要的概括。
Media Player 框架是 iOS 平臺(tái)上一個(gè)用于音頻和視頻播放的高層級接口,它包含了一個(gè)你可以在應(yīng)用中直接使用的默認(rèn)的用戶界面。你可以使用它來播放用戶在 iPod 庫中的項(xiàng)目,或者播放本地文件以及網(wǎng)絡(luò)流。
另外,這個(gè)框架也包括了查找用戶媒體庫中內(nèi)容的 API,同時(shí)還可以配置像是在鎖屏界面或者控制中心里的音頻控件。
AVFoundation 是蘋果的現(xiàn)代媒體框架,它包含了一些不同的用途的 API 和不同層級的抽象。其中有一些是現(xiàn)代 Objective-C 對于底層 C 語言接口的封裝。除了少數(shù)的例外情況,AVFoundation 可以同時(shí)在 iOS 和 OS X 中使用。
AVAudioSession 是用于 iOS 系統(tǒng)中協(xié)調(diào)應(yīng)用程序之間的音頻播放的 API 的。例如,當(dāng)有電話打進(jìn)來時(shí),音頻的播放就會(huì)被暫停;在用戶啟動(dòng)電影時(shí),音樂的播放就會(huì)停止。我們需要使用這些 API 來確保一個(gè)應(yīng)用程序能夠正確響應(yīng)并處理這類事件。
這個(gè)高層級的 API 為你提供一個(gè)簡單的接口,用來播放本地或者內(nèi)存中的音頻。這是一個(gè)無界面的音頻播放器 (也就是說沒有提供 UI 元素),使用起來也很直接簡單。它不適用于網(wǎng)絡(luò)音頻流或者低延遲的實(shí)時(shí)音頻播放。如果這些問題都不需要擔(dān)心,那么 AVAudioPlayer 可能就是正確的選擇。音頻播放器的 API 也為我們帶來了一些額外的功能,比如循環(huán)播放、獲取音頻的音量強(qiáng)度等等。
作為與 AVAudioPlayer 相對應(yīng)的 API,AVAudioRecorder 是將音頻錄制為文件的最簡單的方法。除了用一個(gè)音量計(jì)接受音量的峰值和平均值以外,這個(gè) API 簡單粗暴,但要是你的使用場景很簡單的話,這可能恰恰就是你想要的方法。
AVPlayer 與上面提到的 API 相比,提供了更多的靈活性和可控性。它基于 AVPlayerItem 和 AVAsset,為你提供了顆粒度更細(xì)的權(quán)限來獲取資源,比如選擇指定的音軌。它還通過 AVQueuePlayer 子類支持播放列表,而且你可以控制這些資源是否能夠通過 AirPlay 發(fā)送。
與 AVAudioPlayer 最主要的區(qū)別是,AVPlayer 對來自網(wǎng)絡(luò)的流媒體資源的 “開箱即用” 支持。這增加了處理播放狀態(tài)的復(fù)雜性,但是你可以使用 KVO 來觀測所有的狀態(tài)參數(shù)來解決這個(gè)問題。
AVAudioEngine 是播放和錄制的 Objective-C 接口。它提供了以前需要深入到 Audio Toolbox 框架的 C API 才能做的控制 (例如一些實(shí)時(shí)音頻任務(wù))。該音頻引擎 API 對底層的 API 建立了優(yōu)秀的接口。如果你不得不處理底層的問題,你仍然可以使用 Audio Toolbox 框架。
這個(gè) API 的基本概念是建立一個(gè)音頻的節(jié)點(diǎn)圖,從源節(jié)點(diǎn) (播放器和麥克風(fēng)) 以及過處理 (overprocessing) 節(jié)點(diǎn) (混音器和效果器) 到目標(biāo)節(jié)點(diǎn) (硬件輸出)。每一個(gè)節(jié)點(diǎn)都具有一定數(shù)量的輸入和輸出總線,同時(shí)這些總線也有良好定義的數(shù)據(jù)格式。這種結(jié)構(gòu)使得它非常的靈活和強(qiáng)大。而且它集成了音頻單元 (audio unit)。
Audio Unit 框架是一個(gè)底層的 API;所有 iOS 中的音頻技術(shù)都構(gòu)建在 Audio Unit 這個(gè)框架之上。音頻單元是用來加工音頻數(shù)據(jù)的插件。一個(gè)音頻單元鏈叫做音頻處理圖。
如果你需要非常低的延遲 (如 VoIP 或合成樂器)、回聲消除、混音或者音調(diào)均衡的話,你可能需要直接使用音頻單元,或者自己寫一個(gè)音頻單元。但是其中的大部分工作可以使用 AVAudioEngine 的 API 來完成。如果你不得不寫自己的音頻單元的話,你可以將它們與 AVAudioUnit 節(jié)點(diǎn)一起集成在 AVAudioEngine 處理圖中。
Audio Unit 的 API 可以在 iOS 中進(jìn)行跨應(yīng)用音頻。音頻流 (和 MIDI 命令) 可以在應(yīng)用程序之間發(fā)送。比如說:一個(gè)應(yīng)用程序可以提供音頻的效果器或者濾波器。另一個(gè)應(yīng)用程序可以將它的音頻發(fā)送到第一個(gè)應(yīng)用程序中,并使用其中的音頻效果器處理音頻。被過濾的音頻又會(huì)被實(shí)時(shí)地發(fā)送回原來的應(yīng)用程序中。 CoreAudioKit 提供了一個(gè)簡單的跨應(yīng)用程序的音頻界面。
OpenAL 是一個(gè)跨平臺(tái)的 API。它提供了位置 (3D) 和低延遲的音頻服務(wù)。它主要用于跨平臺(tái)游戲的開發(fā)。它有意地模仿了 OpenGL 中 API 的風(fēng)格。
在 iOS 上,Core MIDI 和 CoreAudioKit 可以被用來使應(yīng)用程序表現(xiàn)為 MIDI 設(shè)備。在 OS X 上,Music Sequencing 服務(wù)提供了基于 MIDI 的控制和對音樂數(shù)據(jù)訪問的權(quán)限。Core MIDI 服務(wù)為服務(wù)器和驅(qū)動(dòng)程序提供了支持。
NSBeep(),它能夠簡單地播放系統(tǒng)中的聲音。NSSound 類為 OS X 提供了用于播放聲音的簡單接口,與 iOS 中的 AVAudioPlayer 在概念上基本類似。NSUserNotification 以及 CloudKit 通知,都可以播放聲音。AVFoundation 實(shí)現(xiàn)。AVFoundation (和 AVKit) 來代替它們。