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