【发布时间】:2015-07-05 19:21:44
【问题描述】:
我正在尝试制作一个准确的计时器来分析输入。我希望能够测量~200ms 信号中的 1% 偏差。 我的理解是使用 AudioUnit 将能够获得 Stefan Popp's example 实现代码 在更新了一些东西以使其在 xcode 6.3 上运行之后,我的示例正在运行,但是:
虽然我最终确实想要捕获音频,但我认为应该有某种方法来获取通知,例如 NSTimer,所以我尝试了 AudioUnitAddRenderNotify,但它完全按照它所说的那样 - 即它与渲染,而不仅仅是一个任意的计时器。有什么方法可以触发回调而无需录制或播放?
当我检查 mSampleTime 时,我发现切片之间的间隔与 inNumberFrames - 512 - 相匹配,结果为 11.6 毫秒。我看到录制和播放的间隔相同。我需要更多的分辨率。
我尝试使用 kAudioSessionProperty_PreferredHardwareIOBufferDuration,但我能找到的所有示例都使用了已弃用的 AudioSessions,所以我尝试转换为 AudioUnits:
Float32 preferredBufferSize = .001; // in seconds
status = AudioUnitSetProperty(audioUnit, kAudioSessionProperty_PreferredHardwareIOBufferDuration, kAudioUnitScope_Output, kOutputBus, &preferredBufferSize, sizeof(preferredBufferSize));
但我得到 OSStatus -10879, kAudioUnitErr_InvalidProperty。
然后我尝试了值为 128 和 256 的 kAudioUnitProperty_MaximumFramesPerSlice,但 inNumberFrames 始终为 512。
UInt32 maxFrames = 128;
status = AudioUnitSetProperty(audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &maxFrames, sizeof(maxFrames));
[编辑] 我正在尝试将输入的时间(用户选择的 MIDI 或麦克风)与应该的时间进行比较。具体来说,乐器是在节拍/节拍器之前还是之后演奏的?演奏多少?这是针对音乐家的,而不是游戏,因此需要精确。
[编辑] 答案似乎对事件有反应。即他们让我准确地看到事情发生的时间,但是我看不到我是如何准确地做事情的。不清楚是我的错。我的应用程序也需要成为节拍器——同步播放节拍上的点击并在节拍上闪烁一个点——然后我可以分析用户的动作以比较时间。但如果我不能准确地演奏节拍,其余的就会崩溃。也许我应该录制音频——即使我不想要它——只是为了从回调中获取 inTimeStamp?
[编辑] 目前我的节拍器是:
- (void) setupAudio
{
AVAudioPlayer *audioPlayer;
NSString *path = [NSString stringWithFormat:@"%@/click.mp3", [[NSBundle mainBundle] resourcePath]];
NSURL *soundUrl = [NSURL fileURLWithPath:path];
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
[audioPlayer prepareToPlay];
CADisplayLink *syncTimer;
syncTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(syncFired:)];
syncTimer.frameInterval = 30;
[syncTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
-(void)syncFired:(CADisplayLink *)displayLink
{
[audioPlayer play];
}
【问题讨论】:
-
此时您的音频播放效果如何?是迷笛吗?还是您手动缓冲音频?有很多 API 可供选择。如果你要做一个卡拉 OK 风格的应用程序,那么你肯定需要从里到外学习核心音频,这需要一段时间。如果您正在做一些更简单的事情,例如检测用户与点击的距离,那么您可以结合使用核心音频和MusicPlayer API
标签: ios objective-c cocoa core-audio audiounit