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 进入后台后暂停问题

从蓝牙命令控制 AVAudioRecorder

AVAudioRecorder - 展开可选时发现 nil

Swift + AVAudioRecorder 非常安静地录制

开发功能更加完善的智能颈部按摩仪

iOS音频与视频的开发- 使用AVAudioRecorder进行录制音频