Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用NSTimer计算两个浮点数之间的时间差_Ios_Objective C_Ios7_Nstimer - Fatal编程技术网

Ios 使用NSTimer计算两个浮点数之间的时间差

Ios 使用NSTimer计算两个浮点数之间的时间差,ios,objective-c,ios7,nstimer,Ios,Objective C,Ios7,Nstimer,我有一个根据麦克风输入而变化的浮点数 我想做一个决定,如果浮点值超过0.2,并且它在上面停留0.3秒或更少 那么,如何使用NSTimer或任何其他方法来获取它呢 这是我的代码: - (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL fileURLWithPath:@"dev/null"]; NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:

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

我想做一个决定,如果浮点值超过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

你的问题不是很清楚。计时器将为您所做的就是触发您的代码,使其以固定的时间间隔执行某些操作

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

这句话令人困惑:

我想做一个决定,如果浮点值超过0.2 停留0.3秒或更短时间

您的意思是想知道该级别是否超过.2并在.3秒或更长时间内保持在>.2

计时器不是连续监控音量的好方法。您将只看到采样间隔处的级别


要做到这一点,我认为您可能需要使用较低级别的音频处理,如AVRecorder或audio units,您可以在很短的时间间隔内收到回拨。

我不知道如何使用麦克风,但是它似乎应该有一些连续的监控功能来向您提供值,而不是您必须不断地轮询值。检查它的API,看看是否可以实时注册连续的值流。如果是这样的话,那么你想做的将是容易的,正如你在第6行中提到的。此外,在测试应用程序时,当lowPassResults>0.2&&lowPassResults<0.5时执行的操作不会只执行一次,它可能会运行100次以上,那么,当if条件为真时,如何使它只运行一次呢@Duncan通过添加逻辑来更改布尔实例变量,当它第一次检测到您要查找的状态时。