19 iphone
我试图检测用户何时吹入iPhone的麦克风.现在我正在使用Stephen Celis的SCListener类来打电话
if ([[SCListener sharedListener] peakPower] > 0.99)
在NSTimer中.但是,当我不吹时,这有时会恢复正常.任何人都有任何示例代码来检查用户是否正在吹入麦克风?
Ada*_*eld 25
我建议首先对电源信号进行低通滤波.总会有一些瞬态噪声会影响瞬时读数; 低通滤波有助于缓解这种情况.一个漂亮而简单的低通滤波器就是这样的:
// Make this a global variable, or a member of your class:
double micPower = 0.0;
// Tweak this value to your liking (must be between 0 and 1)
const double ALPHA = 0.05;
// Do this every 'tick' of your application (e.g. every 1/30 of a second)
double instantaneousPower = [[SCListener sharedListener] peakPower];
// This is the key line in computing the low-pass filtered value
micPower = ALPHA * instantaneousPower + (1.0 - ALPHA) * micPower;
if(micPower > THRESHOLD)  // 0.99, in your example
    // User is blowing on the microphone
小智 13
在iPhone上运行时,应在[recorder prepareToRecorder]之后添加以下代码
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
小智 11
使用return lowPassResults大于0.55.这很好用:
-(void)readyToBlow1 { 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.01 target: self selector: @selector(levelTimerCallback1:) userInfo: nil repeats: YES];
    } else
        NSLog(@"%@",[error description]);
}
-(void)levelTimerCallback1:(NSTimer *)timer { [recorder updateMeters];
    const double ALPHA = 0.05; 
    double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); 
    double lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; 
    if (lowPassResults > 0.55) { 
        lowPassResults = 0.0;
        [self invalidateTimers];
        NextPhase *objNextView =[[NextPhase alloc]init];
        [UIView transitionFromView:self.view
                      toView:objNextView.view
                      duration:2.0
                      options:UIViewAnimationOptionTransitionCurlUp
                      completion:^(BOOL finished) {}
        ];
        [self.navigationController pushViewController:objNextView animated:NO];
    **return;**
    }
}
| 归档时间: | 
 | 
| 查看次数: | 11769 次 | 
| 最近记录: |