關於 "Audio Unit" iOS 提供了音頻處理插件,支持混音,聲音均衡,格式轉化,以及用於錄音,回放,離線渲染,實時對話的輸入輸出。可以動態載入和使用這些強大而靈活的插件,在 iOS 應用中這些插件被稱為 audio units。 Audio units 通常在被稱為 audio proce ...
關於 Audio Unit
iOS 提供了音頻處理插件,支持混音,聲音均衡,格式轉化,以及用於錄音,回放,離線渲染,實時對話的輸入輸出。可以動態載入和使用這些強大而靈活的插件,在 iOS 應用中這些插件被稱為 audio units。
Audio units 通常在被稱為 audio processing graph 的封閉對象的上下文中進行工作,如圖所示,應用程式通過一個或者多個回調函數將音頻發送到 graph 中的第一個音頻單元,並對每一個音頻單元進行單獨控制。在 I/O unit 的輸出(audio processing graph 中最後一個 audio unit)直接連接到輸出硬體。
初識 Audio Unit
由於 audio units 構成了 iOS 音頻堆棧中最低層的編程層,想要高效的使用它們需要比其它音頻技術有更深入的瞭解。除非需要實時播放合成聲音,低延遲輸入輸出,或者特定的 audio unit 功能,否則優先使用 Media Player,AV Foundation,OpenAL 或 AudioToolbox 框架。
Audio Units 提供更快,模塊化音頻處理方案
直接使用 audio units 有兩大優點:
- 出色的響應能力。因為你可以訪問 audio unit 中的實時優先順序線程呈現回調函數,所以你的代碼會儘可能接近 metal。合成樂器和實時同步語音輸入輸入能夠最大收益於直接使用 audio units。
- 動態配置。以 AUGraph 為基礎構建的 audio processing graph API,讓你能夠動態組合,重新配置和重新排列複雜的音頻處理鏈。這是 iOS 中唯一提供此功能的 API。
一個 audio unit 的生命周期如下:
- 在運行時,獲取一個對動態鏈接庫的引用,該庫定義了你想要使用的 audio unit。
- 實例化 audio unit。
- 根據應用需要配置 audio unit。
- 初始化 audio unit 以準備處理音頻。
- 開始音頻流。
- 控制 audio unit。
- 完成後,銷毀 audio unit。
Audio units 提供了非常有用的功能,例如立體聲聲相,混音,音量控制,音頻電平測量。添加 audio units 到你的應用中,你必須掌握一些列基本概念,例如音頻數據流格式,呈現回調函數和音頻單元架構。
選擇設計模式和構建應用程式
- 如何配置 I/O unit。I/O unit 有兩個獨立的 elements,一個從輸入硬體接收音頻,一個發送音頻到輸出硬體。每一種設計模式必須指示該啟用的 element。
- 在 audio processing graph 中,你必須正確指定音頻流支持數據流格式。
- 在哪建立 audio unit 連接,在哪附加回調函數。 audio unit 連接是從一個 audio unit 的輸出,到另一個 audio unit 的輸入流格式的正式構造。回調函數讓你將音頻數據輸入到 graph 中,或者在 graph 中的單個樣本級別操縱音頻。
無論你選擇哪種設計模式,構建 audio unit 應用程式的基本步驟是相同的:
- 配置應用的 audio session,確保你的應用能夠股在系統和設備硬體上下文中正常工作。
- 構建 audio processing graph。
- 提供一個用戶交互控製圖像音頻單元。
充分利用每一個 Audio Unit
大部分文檔都告訴你所有的iOS audio units 都有重要的共同屬性。例如程式需要在運行時指定和載入 audio unit,然後正確指定音頻流格式。
同時,每一個 audio unit 具有某些獨特的特性和要求,從正確的音頻樣本數據類型到如何使用,到所需要的正確配置。瞭解每一個 audio unit 的細節和特定功能,例如如何使用 3D mixer unit,如何使用 Multichannel Mixer。
如何使用文檔
如果你希望快速應用 audio unit,可以下載參考代碼,如遇到問題,查閱文檔。如果你想開始項目前,對 audio unit 有一個較好的基礎,可以先詳細閱讀基礎文檔,然後選擇設計模式,構建自己的應用。如果對開發 audio units 有一定的經驗,僅想使用指定的類型,參考 Using Specific Audio Units.