2011-08-25 82 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