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