【问题标题】:iOS: Sample code for simultaneous record and playbackiOS:同时录制和回放的示例代码
【发布时间】:2011-11-03 07:15:47
【问题描述】:

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

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

【问题讨论】:

    标签: ios audio record playback simultaneous


    【解决方案1】:

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

    【讨论】:

    • 实际上我确实在使用 AVFoundation 时得到了它的工作机会。您只需要确保在开始之前一切都已准备就绪。除此之外,您需要在播放器后 70 毫秒启动记录器,并且它排列得很好。 (这可能会因设备而异)。
    • 很高兴知道。也许你应该回答你的问题。
    【解决方案2】:

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

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

    首先你准备它。

    那你就玩吧。

    所以,准备好一切。然后播放所有内容。

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

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

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

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

    但它确实有效,而且比处理音频队列/单元要整洁得多。

    【讨论】:

    • 你如何“启动它”?你能解释一下你的意思吗?
    • 可悲的是,仍然没有办法做到这一点(至少我能找到)。 70ms 对我来说太不同步了,而且对于今天不同设备的范围,不同步的差异太大了。在 iPhone 5s 上,我得到大约 66 毫秒,但在 iPhone 6 上,我得到大约 40 毫秒。我注意到这篇文章是 2011 年发布的。你有没有找到更好的方法?
    【解决方案3】:

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

    检查this answer 有很好的解释。

    【讨论】:

    • 能否提供代码。过去 4 天我一直在苦苦挣扎。
    • 当然,我的代码在 Xamarin 中,但我想快速或客观地编写它并不难。看看我在答案中提供的链接,有一个例子。另外,请确保您准备好您的录音机(我使用 AVAudioRecorder 和 prepareToRecord)和您的播放器(我使用文件名创建一个 AVPlayer 实例),以便它们以低延迟开始。此外,当您激活 AudioSession 时,请确保将类别设置为 playAndRecord。在 Xamarin 中看起来像这样:AVAudioSession.SharedInstance().SetPreferredIOBufferDuration(0.005, out error);
    • 我有一个 AudioSessionHelper 类,它带有一个名为 ActivateMyAudioSesion 的函数,我在其中设置类别、设置模式、preferredIOBufferDuration,然后将其激活。我在开始第一次录制之前调用这个函数(不要每次都调用它,因为它很昂贵),或者你可以在你的应用程序启动时调用它。希望对您有所帮助!
    • 链接:stefanpopp.de/2011/capture-iphone-microphone 来自此代码的参考我无法在蓝牙扬声器中播放。它在说话时在耳机中播放(顶部)。我想在通话时在蓝牙扬声器中播放音频。你能帮我吗?我尝试了很多链接和不同的方式,但我没有得到。
    • 您是否尝试使用蓝牙低延迟同时录制和播放?我不知道该怎么做,也不确定是否有可能以低延迟做到这一点,因为某些蓝牙设备不可靠。
    猜你喜欢
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多