我能够创建我想要的avaudioplayer和avaudiorecorder的确切功能,但当然遇到了延迟问题。因此,在阅读了网络上的几乎每篇文章并查看了大量示例代码之后,我仍然不确定如何实现以下目标:
- 用户选择录制 2 小节长(每小节 4 拍(的样本,并进行预滚动/计数
- 用户点击记录
- 节拍器开始计数 4 拍(第一拍重音(
- 该应用程序在下一个栏的开头自动开始录制
- 该应用程序会自动关闭第 3 小节末尾的录制(2 小节 + 前贴片(
- 然后,用户可以播放其录制内容或删除录制内容并重新开始。
因此,使用avaudioplayer和avaudiorecorder,我只是使用大胆创建了一个"caf",节拍器设置为正确的bpm(为应用程序设置了bpm(。然后,我设置并播放 avaudioplayer 并使用 audiodidfinish成功委托方法,执行一些逻辑来启动录音机、重新启动播放器、维护循环计数等以关闭录音和音频。
正如我所提到的,我几乎能够实现我所追求的用户体验,但延迟问题是不可接受的。
我一直在使用音频单元和远程IO,并设置了一个带有播放回调和录音机回调等的项目,但现在面临着如何根据上述描述进行这项工作的问题。我正在尝试为初学者解决以下问题:
- 如果我创建一个 1 拍 caf 文件,我如何使用音频单元和远程 IO 播放 x 个节拍然后停止?
- 我如何进行预滚动并在 4 拍后开始录音回调
谁能给我一些想法或为我指出正确的方向。正如我所提到的,我已经做了一堆研究,包括购买核心有声读物,阅读每篇关于 atastypixel.com、timbolstad.com 等的文章,并浏览苹果文档。
提前感谢您的帮助。
我启动了一个NSTimer。 使用基于 BPM(每分钟节拍数(/60 的值。 因此,如果用户想要记录一个带有计数的 2 bar 文件,可能会执行以下操作:
//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++
}