【问题标题】:Using NSTimer to calculate the time difference between two float numbers使用 NSTimer 计算两个浮点数之间的时间差
【发布时间】:2014-05-29 21:04:35
【问题描述】:

我有一个根据麦克风输入而变化的浮点数。

如果浮点值超过 0.2 并且在它上面停留 0.3 秒或更短,我想做出决定。

那么如何使用 NSTimer 或者其他方式来获取呢?

这是我的代码:

- (void)viewDidLoad
{
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:@"dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithFloat:44100.0],             AVSampleRateKey,
                          [NSNumber numberWithInt: kAudioFormatAppleLossless],  AVFormatIDKey,
                          [NSNumber numberWithInt:1],                     AVNumberOfChannelsKey,
                          [NSNumber numberWithInt: AVAudioQualityMax],AVEncoderAudioQualityKey,
                          nil];
NSError *error;
recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error];
if (recorder) {
    [recorder prepareToRecord];
    recorder.meteringEnabled = YES;
    [recorder record];
    levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(levelTimerCallBack:) userInfo:nil repeats:YES];
}
else {
    NSLog(@"fail");
}
}


 - (void)levelTimerCallBack:(NSTimer *)timer {
[recorder updateMeters];

const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
if (lowPassResults > 0.2 && lowPassResults < 0.5) {
           // here to get the length of time that lowPassResults stays between 0.2 and 0.5
}
}

@end

【问题讨论】:

  • 我不知道如何使用麦克风,但它似乎应该有一些持续的监控功能来为你提供值,而不是你必须不断地轮询这些值。检查其 API 以查看您是否可以实时注册连续的值流。如果是这样,那么您想做的事情将很容易

标签: ios objective-c ios7 nstimer


【解决方案1】:

你的问题不是很清楚。计时器将为您做的就是触发您的代码定期执行某些操作。

您可以使用计时器触发定期对音频电平进行采样。

这句话虽然令人困惑:

如果浮点值超过 0.2,我想做出决定 在它上面停留 0.3 秒或更短。

您的意思是您想知道水平是否超过 0.2 并保持在 > .2 0.3 秒或更长时间?

计时器不是持续监控音量的好方法。您只会看到采样间隔内的水平。

为此,我认为您可能需要使用较低级别的音频处理,例如 AVRecorder 或音频单元,您可以在很短的时间间隔内收到回调。

【讨论】:

  • 是的,正如您在第 6 行中提到的那样。另外在测试应用程序时,lowPassResults > 0.2 && lowPassResults
  • 通过添加逻辑,在布尔实例变量首次检测到您正在寻找的状态时更改它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多