2011-08-25 19 views
14

我正在設計多軌錄音機的簡單概念驗證。iOS:用於同時錄製和播放的示例代碼

明顯的出發點是從文件A.caf玩耳機的同時錄製麥克風輸入文件B.caf

這個問題 - Record and play audio Simultaneously - 指出,有三個層次,在這我可以工作:

  • AVFoundation API(AVAudioPlayer + AVAudioRecorder)
  • 音頻隊列API
  • 音頻單元API(RemoteIO)

工作的最佳水平是什麼?很明顯,通用答案是在最高層面工作,完成工作,這將是AVFoundation。

我只是參加了從人這個工作誰給了因延遲問題(他得到的文件之間的延時0.3秒),所以也許我需要在一個較低的水平,努力避免這些問題?

此外,什麼是源代碼可從跳板?我一直在看SpeakHere樣本(http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html)。如果我找不到更簡單的東西,我會使用它。

但任何人都可以提出一些簡單/其他?如果我能避免它,我寧願不使用C++代碼。

是任何人都知道,它使用AVFoundation做一些這方面的公共代碼?

編輯:AVFoundation例如這裏:http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1

EDIT(2):很多更好看的一個位置:http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT(3):How do I record audio on iPhone with AVAudioRecorder?

回答

5

正如Viraj所建議的,這裏是答案。

是的,你可以實現使用AVFoundation很好的效果。首先,你需要注意的事實是,對於玩家和記錄者來說,激活它們是一個兩步過程。

首先你要填好它。

然後你玩它。

因此,最重要的一切。然後玩一切。

這將讓你的等待時間下降到約70毫秒。我通過錄制節拍器標記進行測試,然後通過揚聲器回放音樂,同時將iPhone固定在揚聲器上並同時進行錄製。

第二記錄有明確的回聲,這是我發現是〜70ms的。我可以分析Audacity中的信號以獲得確切的偏移量。

因此,爲了一切線向上我剛performSelector:X withObject:Y afterDelay:70.0/1000.0

有可能是隱藏的斷枝,例如延遲可以從設備的不同而不同的設備。它可能會因設備活動而有所不同。甚至有可能在啓動播放器和啓動錄音機之間線程可能被中斷/重新安排。

但它的工作原理,比整理音頻隊列/單元更爲整齊。

+1

你如何「主宰它」?你能解釋一下你的意思嗎? –

+3

您能否提供此功能的示例代碼? –

+1

不幸的是,仍然沒有辦法做到這一點(至少我能找到)。對我而言,70毫秒對於我來說太不同步了,而對於今天不同設備的範圍,異步的差異太大了。在iPhone 5s上,我獲得了大約66ms,但在iPhone 6上,我獲得了大約40ms。我注意到這篇文章是從2011年開始的。你有沒有找到一個更好的方法來做到這一點?你可以提供代碼嗎?請問 – Sti

6

爲了避免延遲問題,你將不得不在比AVFoundation更低的水平工作好吧。查看Apple的示例代碼 - Auriotouch。它使用遠程I/O。

+1

其實我在使用AVFoundation時確實得到了它的工作點。在啓動之前,您必須確保一切準備就緒。除此之外,您需要在播放器後的70毫秒處啓動錄音機,並且它線條良好。 (這可能會根據設備而改變)。 –

+2

很高興知道。也許你應該回答你的問題。 – Viraj

1

我有這個問題,我只是通過更改AudioSessionPreferredHardwareIOBufferDuration參數來解決它。我認爲我現在只有6毫秒的延遲,對我的應用來說已經足夠了。

檢查this answer這有一個很好的解釋。

+0

。我從過去4天開始掙扎。 –

+0

當然,我擁有的代碼是在Xamarin中,但我猜並不難以迅速或客觀地編寫代碼。看看我在答案中提供的鏈接,有一個例子。此外,請確保您準備好您的錄音機(我使用AVAudioRecorder和prepareToRecord)和您的播放器(我使用文件名創建AVPlayer實例),然後開始低延遲。另外,當您激活AudioSession時,請確保您將類別設置爲playAndRecord。在Xamarin看起來像這樣: 'AVAudioSession.SharedInstance()。SetPreferredIOBufferDuration(0.005,out error);' – ernewston

+0

我有一個AudioSessionHelper類與一個名爲ActivateMyAudioSesion函數,我設置類別,設置模式,preferredIOBufferDuration然後我使它活躍起來。在開始第一次錄製之前我會調用這個函數(不要每次都調用它,因爲它很貴),或者您可以在應用程序啓動時執行此操作。希望能幫助到你! – ernewston