我能够为 avaudioplayer 和 avaudiorecorder 创建我想要的确切功能,但当然遇到了延迟问题。因此,在阅读了网络上的几乎所有文章并查看了大量示例代码之后,我仍然不确定如何实现以下目标:

  • 用户选择使用预卷/计数
  • 录制 2 小节长(每小节 4 拍)的样本
  • 用户点击记录
  • 一个节拍器以 4 拍开始计数(在第一拍上重音)
  • 应用程序在下一个小节开始时自动开始录制
  • 应用程序在第 3 个小节(2 个小节 + 前滚​​)结束时自动关闭录制
  • 然后用户可以播放他们的录音或删除它并重新开始。

  • 因此,使用 avaudioplayer 和 avaudiorecorder 我只是使用 audacity 创建了一个“caf”,节拍器设置为正确的 bpm(为应用程序设置了 bpm)。然后我设置和播放 avaudioplayer 并使用 audiodidfinishsuccessfully 委托(delegate)方法,执行一些逻辑来启动录音机,重新启动播放器,保持循环计数等以关闭录音和音频。

    正如我所提到的,我几乎能够实现我所追求的用户体验,但延迟问题是 Not Acceptable 。

    我一直在使用音频单元和远程 IO,并设置了一个带有播放回调和录音机回调等的项目,但现在面临如何根据上述描述进行工作的问题。我正在尝试为初学者解决以下问题:
  • 如果我创建一个 1 节拍 caf 文件,我如何利用音频单元和远程 IO 播放 x 节拍数然后停止?
  • 如何进行预滚动并在 4 次节拍后开始录制回调

  • 谁能给我一些想法或指出我正确的方向。正如我所提到的,我已经做了大量的研究,包括购买核心有声读物,阅读 atastypixel.com、timbolstad.com 等上的每一篇文章,并浏览了苹果文档。

    在此先感谢您的帮助。

    最佳答案

    我启动了一个 NSTimer。使用基于 BPM(每分钟节拍数)/60 的值。因此,如果用户想要记录带有计数的 2 小节文件,可能会执行以下操作:

    //timer interval=100BPM/60secs per minute
    timerInterval=100/60;
    
        metroTimer = [NSTimer scheduledTimerWithTimeInterval:timerinterval target:self selector:@selector(blinkMetroLight) userInfo:nil repeats:YES];
    
    
    
    
     - (void)blinkMetroLight
        {
    
            if(beatNumber == 0)
            {
                beatNumber = 1;
    
    
            }
            else if (beatNumber == 5)
            {
                [self audioProcessorStart];
            }
            if (beatNumber == 8)
            {
    
                    [self audioProcessorStop];
                    [metroTimer invalidate]; metroTimer = nil;
            }
    
        beatNumber++
        }
    

    关于ios - 使用远程 IO 对设定长度的节拍器进行录音,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10688286/

    10-09 16:31