鍍金池/ 教程/ iOS/ 音頻 API 一覽
與四軸無(wú)人機(jī)的通訊
在沙盒中編寫(xiě)腳本
結(jié)構(gòu)體和值類(lèi)型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測(cè)試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動(dòng)開(kāi)發(fā)
Collection View 動(dòng)畫(huà)
截圖測(cè)試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個(gè)完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動(dòng)布局工具箱
動(dòng)畫(huà)
為 iOS 7 重新設(shè)計(jì) App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實(shí)例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類(lèi)
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動(dòng)畫(huà)解釋
響應(yīng)式 Android 應(yīng)用
初識(shí) TextKit
客戶(hù)端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項(xiàng)目介紹
Swift 的強(qiáng)大之處
測(cè)試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計(jì)優(yōu)雅的移動(dòng)游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動(dòng)畫(huà)
常見(jiàn)的后臺(tái)實(shí)踐
糟糕的測(cè)試
避免濫用單例
數(shù)據(jù)模型和模型對(duì)象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場(chǎng)
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類(lèi)
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計(jì)的藝術(shù)
導(dǎo)航應(yīng)用
線程安全類(lèi)的設(shè)計(jì)
置換測(cè)試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無(wú)人機(jī)項(xiàng)目
Mach-O 可執(zhí)行文件
UI 測(cè)試
值對(duì)象
活動(dòng)追蹤
依賴(lài)注入
Swift
項(xiàng)目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測(cè)試 View Controllers
訪談
收據(jù)驗(yàn)證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場(chǎng)
游戲
調(diào)試核對(duì)清單
View Controller 容器
學(xué)無(wú)止境
XCTest 測(cè)試實(shí)戰(zhàn)
iOS 7
Layer 中自定義屬性的動(dòng)畫(huà)
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲(chǔ)
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺(jué)
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫(kù)支持
Fetch 請(qǐng)求
導(dǎo)入大數(shù)據(jù)集
iOS 開(kāi)發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語(yǔ)言標(biāo)簽
同步案例學(xué)習(xí)
依賴(lài)注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識(shí)別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過(guò)程

音頻 API 一覽

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 框架

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

AVFoundation 是蘋(píng)果的現(xiàn)代媒體框架,它包含了一些不同的用途的 API 和不同層級(jí)的抽象。其中有一些是現(xiàn)代 Objective-C 對(duì)于底層 C 語(yǔ)言接口的封裝。除了少數(shù)的例外情況,AVFoundation 可以同時(shí)在 iOS 和 OS X 中使用。

AVAudioSession

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)事件。

AVAudioPlayer

這個(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)度等等。

AVAudioRecorder

作為與 AVAudioPlayer 相對(duì)應(yīng)的 API,AVAudioRecorder 是將音頻錄制為文件的最簡(jiǎn)單的方法。除了用一個(gè)音量計(jì)接受音量的峰值和平均值以外,這個(gè) API 簡(jiǎn)單粗暴,但要是你的使用場(chǎng)景很簡(jiǎn)單的話(huà),這可能恰恰就是你想要的方法。

AVPlayer

AVPlayer 與上面提到的 API 相比,提供了更多的靈活性和可控性。它基于 AVPlayerItemAVAsset,為你提供了顆粒度更細(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

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 框架

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 處理圖中。

跨應(yīng)用程序音頻

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)用程序的音頻界面。

其他 APIs

OpenAL

OpenAL 是一個(gè)跨平臺(tái)的 API。它提供了位置 (3D) 和低延遲的音頻服務(wù)。它主要用于跨平臺(tái)游戲的開(kāi)發(fā)。它有意地模仿了 OpenGL 中 API 的風(fēng)格。

MIDI

在 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)程序提供了支持。

更多

  • 在 OS X 中,最基本的音頻接口就是 NSBeep(),它能夠簡(jiǎn)單地播放系統(tǒng)中的聲音。
  • NSSound 類(lèi)為 OS X 提供了用于播放聲音的簡(jiǎn)單接口,與 iOS 中的 AVAudioPlayer 在概念上基本類(lèi)似。
  • 所有的通知 API,包括 iOS 中的本地通知或者推送通知、OS X 中的 NSUserNotification 以及 CloudKit 通知,都可以播放聲音。
  • Audio Toolbox 框架是強(qiáng)大的,但是它的層級(jí)卻非常的低。在過(guò)去,它基于 C++ 所編寫(xiě),但是其大多數(shù)的功能現(xiàn)在都可以通過(guò) AVFoundation 實(shí)現(xiàn)。
  • QTKit 和 QuickTime 框架現(xiàn)在已經(jīng)過(guò)時(shí)了,它們不應(yīng)該被用在以后的開(kāi)發(fā)中。我們應(yīng)該使用 AVFoundation (和 AVKit) 來(lái)代替它們。