代码之家  ›  专栏  ›  技术社区  ›  jo

检测到iPhone麦克风被吹坏了?

  •  19
  • jo  · 技术社区  · 16 年前

    我正在尝试检测用户何时对着iPhone的麦克风吹气。现在我正在使用来自的sclistener类 Stephen Celis 打电话

    if ([[SCListener sharedListener] peakPower] > 0.99)
    

    在NSTIMER中。然而,有时当我不吹气的时候,这又会变成现实。有没有人有样本码来检查用户是否在对着麦克风吹气?

    5 回复  |  直到 9 年前
        1
  •  25
  •   Adam Rosenfield    16 年前

    我建议你 low-pass filtering 首先是电源信号。总是会有一定量的瞬态噪声干扰瞬时读数;低通滤波有助于减轻这种干扰。一个简单易行的低通滤波器应该是这样的:

    // 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
    
        2
  •  13
  •   jinhua liao    11 年前

    在iPhone上运行时,应在[Recorder PrepareToRecorder]后添加以下代码

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    
        3
  •  11
  •   Cesare    9 年前

    使用返回作为 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;**
        }
    }
    
        4
  •  4
  •   user1533983    12 年前

    http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/

    本教程适用于模拟器,但不适用于iPhone。iPhone麦克风没有响应。

        5
  •  2
  •   Sudhakar    11 年前

    试试这个,它对我很管用。谢谢@Jinhua Liao

    - (void)viewDidLoad {
       [super viewDidLoad];
    
    lowPassResults = 0.0;
    [self 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];
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
        [[AVAudioSession sharedInstance] setActive:YES error:nil];
        recorder.meteringEnabled = YES;
        [recorder record];
        levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 target: self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES];
    } else
        NSLog([error description]); 
    
    }
    
    - (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;  
    NSLog(@"lowpassResult is %f",lowPassResults);
    if (lowPassResults > 0.95){
        NSLog(@"Mic blow detected");
        [levelTimer invalidate];
    }
    }