2

對於我的一個項目,我需要檢測用戶何時吹進麥克風。我按照這個教程:http://www.mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/和這個問題:Detect blow in Mic and do something 但我仍然沒有得到我想要的結果。這種打擊方式太晚了,或者根本沒有。當我調整一些結果時,打擊被正確檢測到,但是這個打擊被觸發得太快了,也就是說。當你說話或發出咔嗒聲時,它也會被檢測到。檢測到麥克風的一擊

有沒有人發現檢測一個打擊的好方法?謝謝。

回答

4

AVAudioRecorder聲級API並非旨在爲您提供可靠的結果,以便將吹出的聲音與話筒接收的其他類型的聲音分開。

我建議使用音頻隊列或音頻單元RemoteIO API,測量RMS信號能量,包絡持續時間,然後使用加速FFT庫檢查寬帶噪聲與峯值的頻譜, 。

例如更可靠的結果將需要比1次OS調用更多的工作。

0

我已經使用AudioQueueGetProperty()爲kAudioQueueProperty_CurrentLevelMeter取得了不錯的成功。

2
Use return as you get first lowpass results >0.55 

I have solve the issue have a look. 

-(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])); lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; //NSLog(@"lowPassResults= %f",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;** 
} 

}