15

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

明显的起点是从文件 A.caf 播放到耳机,同时将麦克风输入记录到文件 B.caf

这个问题——同时录制和播放音频——指出我可以在三个级别上工作:

  • 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):如何使用 AVAudioRecorder 在 iPhone 上录制音频?

4

3 回答 3

6

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

于 2011-08-25T05:47:02.703 回答
5

正如 Viraj 所建议的,这就是答案。

是的,您可以使用 AVFoundation 获得非常好的结果。首先,您需要注意,对于播放器和记录器而言,激活它们是一个两步过程。

首先,您先启动它。

然后你玩它。

所以,准备好一切。然后玩一切。

这将使您的延迟降低到大约 70 毫秒。我通过录制节拍器的滴答声进行测试,然后通过扬声器播放它,同时将 iPhone 举到扬声器上并同时录制。

第二个录音有一个清晰的回声,我发现它约为 70 毫秒。我本可以分析 Audacity 中的信号以获得准确的偏移量。

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

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

但它可以工作,而且比搞乱音频队列/单元要整洁得多。

于 2011-08-28T07:00:22.007 回答
1

我遇到了这个问题,我在我的项目中简单地通过PreferredHardwareIOBufferDuration更改AudioSession. 我想我现在只有 6 毫秒的延迟,这对我的应用程序来说已经足够了。

检查这个有很好解释的答案。

于 2015-04-07T15:04:10.717 回答