iOS:用于同时录制和播放的示例代码

时间:2011-08-25 02:03:07

标签: ios audio record playback simultaneous

我正在为多轨录音机设计一个简单的概念证明。

明显的出发点是从文件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

编辑(2):在这里看得更好:http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

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

3 个答案:

答案 0 :(得分:6)

为避免延迟问题,您必须在比AVFoundation更低的级别工作。查看Apple的示例代码 - Auriotouch。它使用远程I / O.

答案 1 :(得分:5)

根据Viraj的建议,这是答案。

是的,使用AVFoundation可以获得非常好的效果。首先,您需要注意这样一个事实:对于播放器和录像机,激活它们是一个两步过程。

首先你准备它。

然后你玩它。

所以,一切都是好的。然后播放一切。

这会使您的延迟降至约70毫秒。我通过录制节拍器音符进行测试,然后通过扬声器播放,同时将iPhone连接到扬声器并同时录制。

第二次录音有一个清晰的回声,我发现它是~70ms。我本可以分析Audacity中的信号来获得精确的偏移量。

因此,为了排列所有内容,我只需执行Selector:x withObject:y afterDelay:70.0 / 1000.0

可能存在隐藏的障碍,例如延迟可能因设备而异。它甚至可能因设备活动而异。甚至可能在启动播放器和启动录音机之间线程被中断/重新安排。

但是它有效,并且比使用音频队列/单元更加整洁。

答案 2 :(得分:1)

我遇到了这个问题,我只是通过更改PreferredHardwareIOBufferDuration的{​​{1}}参数在项目中解决了这个问题。我想我现在只有6毫秒的延迟,这对我的应用来说已经足够了。

查看具有良好解释的this answer