2017-08-11 221 views
3

我有一個關於CoreAudio和AVFoundation的問題。CoreAudio和AVFoundation之間的性能

我使用帶有AUGraph和AudioUnit的CoreAudio構建了專業音頻應用程序。

我想切換到AVFoundation框架,這似乎是非常棒的。但由於我擔心表演,我想多瞭解一點。

在我的核心音頻渲染回調中,我可以用44100kHz的採樣率處理512個採樣,所以我的回調每10ms調用一次,我認爲它可以很容易地加快(對嗎?)。

現在在AVFoundation中,呈現回調是AVAudioNode的Tap。並且我在評論中看到,bufferSize參數是the requested size of the incoming buffers in sample frames. Supported range is [100, 400] ms.那麼這是否意味着我將無法在每次調用中處理少於4410個樣本?

限制是否來自Objective-C約束(消息調用,鎖等)?

它不會對實時DSP過程產生影響嗎?

回答

4

在我使用iOS AVAudioEngine API(iOS 10.3.3)的實驗中,我確實發現在AVAudioNode總線上安裝一個水龍頭不會在我的iPhone 7上提供比4410採樣短的緩衝區。這可能是因爲AVAudioEngine tap與CoreAudio音頻單元回調相比,將緩衝區傳遞到較低優先級的線程,因此無法像往常一樣可靠地進行調用,從而導致更高的延遲。

但是,可以創建一個V3 AUAudioUnit子類,並將接收到的緩衝區(由實例的internalRenderBlock輸出)從512配置爲短至樣本的64個樣本。在音頻會話上調用setPreferredIOBufferDuration似乎設置首選的AUAudioUnit呈現塊緩衝區大小。我發佈了一些測試代碼(混合Swift 3 plus Objective C),用於創建我認爲是低延遲的V3 AUAudioUnit音色生成器子類here。人們需要了解並遵循渲染塊內的實時編碼限制(無方法調用,鎖定,內存分配等),因此塊內的音頻上下文代碼的純C似乎最好(甚至是強制性的)。

對於延遲相同的低延遲話筒輸入,您可以嘗試將音頻單元子類連接到audioEngine的inputNode,然後在您的單元渲染模塊內調用輸入的AURenderPullInputBlock。

+0

非常感謝你@ hotpaw2!我總是很感謝你在這裏的質量答案。 這就是我正在尋找的,它似乎是一個很好的解決方案。我沒有介紹AUAudioUnit的子類。順便說一句,我們無法從AVAudioPlayer獲得音頻單元,所以我們非常傷心...所以,如果我理解的很好,以較高的速率獲取/更改AVAudioPlayerNode示例的正確方法是:AVAudioPlayerNode - > MyCustomAU(with呈現回調) - > OtherAVAudioUnit。事實上,似乎只用macOS 10.13或更高版本就可以從中獲得AudioUnit ... – DEADBEEF

+0

我以前的評論的來源[Apple文檔](https://developer.apple.com/documentation/avfoundation/avaudionode/2866396-auaudiounit) – DEADBEEF

+0

AUAudioUnit子類似乎適用於在運行於macOS 10.12下的iOS Simulator內運行的代碼。猜猜這可能意味着什麼... – hotpaw2

相關問題