iPad 上的 AVAudioRecorder 仪表延迟
Posted
技术标签:
【中文标题】iPad 上的 AVAudioRecorder 仪表延迟【英文标题】:AVAudioRecorder meter delay on iPad 【发布时间】:2011-07-11 05:53:09 【问题描述】:我无法从 AVAudioRecorder 获得准确的仪表读数(在 iPad 上测试)。
音量上升时似乎工作正常,但音量下降时会出现延迟。例如:我对着麦克风说话并慢慢提高我的声音。我希望读数从 -35.567 增加到 -34.678 到 -10.579,但是当我停止说话时,会延迟 1 到 2 秒,然后才回落到 -35.567(或其他任何情况)。 NSLog 继续从循环中更新,但在延迟期间仪表数保持不变,即使声音早已结束。
我已经添加了下面代码的要点,如果需要,我很乐意提供完整的代码。
我像这样初始化记录器:
AVAudiosession * audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error: &error];
[audioSession setActive:YES error: &error];
NSMutableDictionary* recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey];
recordedTmpFile = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent: [NSString stringWithString: @"Recording.caf"]]];
recorder = [[ AVAudioRecorder alloc] initWithURL:recordedTmpFile settings:recordSetting error:&error];
[recorder setDelegate:self];
[recorder prepareToRecord];
[recorder setMeteringEnabled:YES];
[recorder record];
并循环更新仪表:
-(void) loop:(ccTime)dt
if(isRecording == YES)
//get volume levels
[recorder updateMeters];
float level = [recorder peakPowerForChannel:0];
NSLog(@"Vol: %f", level);
已编辑:我还应该提到我正在使用 Cocos2d 调度来进行循环:
[self schedule:@selector(loop:)];
知道为什么会有这么长时间的延迟吗?
已编辑:我尝试使用平均峰值功率,这没有延迟。所以我可能会用它来解决这个问题。但是,我宁愿不使用平均峰值功率,而且很高兴了解发生了什么。
【问题讨论】:
loop:(ccTime)dt函数的循环间隔是多少? 默认值。我不确定那是什么。但是循环在延迟期间一遍又一遍地更新 NSLog。该数字保持不变,直到突然回落。 这开始循环:[self schedule:@selector(loop:)]; 运气好能找到答案吗?我也有这个问题 不抱歉。我不得不解决一个工作。我最终使用通道的平均功率而不是通道的峰值功率。它当然是平均的,但它的反应要好得多,而且对于我正在做的事情来说已经足够了。如果您找到答案,我仍然想知道。我讨厌不得不解决工作!干杯。 【参考方案1】:我相信大多数人都知道这一点,但如果您希望减少计量延迟,您需要使用 AudioQueue 或 RemoteIO。在这里查看更好的解释:
Confusion with meters in AVAudioRecorder
【讨论】:
【参考方案2】:您可以通过将meteringEnabled
属性重置为YES
来解决此问题。
yourRecorderName.meteringEnabled = YES
每次您希望将关卡重置为环境关卡时调用此函数。这大约需要 0.02 秒,在此期间电平会短暂下降到 0 或 -120 dB,然后重置为环境。
或者,您可以使用:
[yourRecorderName stop]
[yourRecorderName record]
这大约需要 0.05 秒,但在等待时间内级别不会下降到 0。事实上,什么都不会发生,因为在这种情况下,记录器对象实际上需要 0.05 秒才能停止并重新开始记录。
【讨论】:
【参考方案3】:使用计时器怎么样?它会更快 之后
NSError* error
if (recorder)
recorder.meteringEnabled = YES;
[recorder record];
levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
else
NSLog(@" error %@",[error description]);
其中 levelTimer 是 NStimer,它调用执行您想要的功能的函数(levelTimerCallback:)、更新仪表等。
-(IBAction)levelTimerCallback:(NSTimer*)timer
[recorder updateMeters];
float level = [recorder peakPowerForChannel:0];
NSLog(@"Vol: %f", level);
【讨论】:
没有。它对我不起作用。您是否设法让它最终发挥作用,还是未经测试?没有恶意 - 我只是想知道我的设置是否有问题。问题似乎不是计时器。计时器继续更新控制台,但当它应该下降时数字保持不变。感谢您的帮助。以上是关于iPad 上的 AVAudioRecorder 仪表延迟的主要内容,如果未能解决你的问题,请参考以下文章
iPhone AVAudioRecorder 进入后台后暂停问题