2016-01-15 68 views
1

我需要以8kHz的採樣率(大約)1秒鐘來分析音頻數據塊。儘管音頻將被實時錄製,但它只會用於檢測特定事件。因此,沒有嚴格的等待時間要求。這種情況下最好的框架是什麼?如何獲取用於分析核心音頻或AVFoundation的音頻塊

我已經開始學習Core Audio,並且學習了Core Audio。通過互聯網上最少量的Swift文檔,我可以設置AUGraph for iOS來使用遠程I/O音頻單元錄製音頻,並通過輸出呈現回調訪問原始樣本。不幸的是,我堅持要創建1秒的音頻樣本塊來執行音頻分析。可以使用自定義的AudioBufferList嗎?或者是否可以在遠程I/O音頻單元上實現大型鈴聲緩衝器(如果是HAL音頻單元,則需要它)?

我也試着採用AVAsoundReader的AVFoundation來獲取音頻塊。雖然我能夠獲得錄製的音頻信號的樣本,但我沒有成功創建1秒的緩衝區(我甚至不知道是否可以實時進行此操作)。無論如何,AVFoundation在這種情況下是不錯的選擇?

我希望對此有任何建議。

對我來說,一個主要問題是我嘗試使用Swift,但沒有太多示例代碼可用,並且文檔更少。我覺得切換到用於音頻編程的Objective-C會更好,並停止嘗試在Swift中獲取所有內容。我很好奇這是否會是一個更好的時間投資?

回答

1

Core Audio是一個C API。 Objective-C是C的擴展。我發現Objective-C比使用核心音頻更適合使用swift。

我創建了一個跨平臺c無鎖環形緩衝區。有示例代碼演示如何設置戒指,設置麥克風,播放音頻以及從戒指讀取和寫入。

該戒指記錄最後N秒的指定。舊數據被新數據覆蓋。所以你指定你想記錄最近的3秒鐘。我演示的樣本在通過麥克風進行錄製時播放正弦波。每隔7秒鐘,它抓取錄製音頻的最後2秒鐘。

Here is the complete sample code on github

+1

這非常有幫助!非常感謝。根據您的評論以及我在Swift中使用Core Audio的經驗,我只是決定切換到Objective-C。儘管我通過「學習Core Audio」工作,但我可能需要更多地提高我的Objective-C技能,但我一定會嘗試更詳細地瞭解您的代碼。現在我想知道你實現的ringbuffer和Apple的CARingBuffer以及Michael Tyson的TPCircularBuffer是否有很大的區別? – Gerard

+0

自從我看了TP以來已經有一段時間了。但通常泰森先生寫的東西都很好。我沒有看過CA,但我確信它是穩定的。 大多數環形緩衝區允許您「消耗」並刪除緩衝區(FIFO)中的最早數據。所以從環中讀取得到最老的數據。礦山工作在最新的數據。它在2秒前和現在之間獲得數據。假設你有一個6秒的緩衝區。我的讀取得到了第4到第6秒,其他環形緩衝區實現的秒數從0到2,所以我就像一個LIFO。 如果您沒有任何實時限制,TP或CA可能正常工作。 – jaybers

+0

我終於完成了你的代碼,並且我很瞭解它。但是,在運行代碼時,播放不起作用(只是正弦波)。我觀察到渲染回調(outRenderProc)中沒有AudioUnitRender從系統輸入(只是正弦波發生器)中繪製。但是當我添加AudioUnitRender時沒有任何改變。可能是因爲interruptListener配置不正確?我試圖修改它,但無法使其工作。我希望你能對此發表評論。 – Gerard

2

爲了分析1秒的音頻採樣窗口,最簡單的解決方案是使用帶有無鎖環形緩衝區的音頻隊列API(大約2秒鐘)來記錄採樣。您可以使用重複的nstimer任務來輪詢緩衝區的完整程度,並在處理任務可用時發出1秒的塊。

核心音頻和RemoteIO音頻單元用於如果您需要更短的數據窗口,延遲要求幾毫秒。

+0

這很清楚。因爲我可能想在未來進行實時音頻處理,所以我認爲音頻單元對我來說是最適合的。儘管你的答案很有用,但由於示例代碼,我接受了另一個答案(不幸的是,我不能同時接受這兩個答案)。 – Gerard

相關問題