2009-04-28 17 views
18

मैं यह पता लगाने की कोशिश कर रहा हूं कि उपयोगकर्ता आईफोन के माइक में उड़ रहा है। अभी मैं Stephen Celis से SCListener वर्ग का उपयोग कर रहा एक NSTimer मेंआईफोन माइक्रोफोन पर उड़ने का पता लगाना?

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

कॉल करने के लिए। हालांकि, जब मैं उड़ नहीं रहा हूं तो यह कभी-कभी सच होता है। किसी के पास कोई नमूना कोड है यह जांचने के लिए कि क्या उपयोगकर्ता mic में उड़ रहा है या नहीं?

+4

शायद हवा बह रही है। :) क्षमा करें, इस सवाल ने मुझे हंस दिया। –

+0

हां, नहीं। यहां तक ​​कि जब मैं अंदर होता, तब भी स्क्रीन पर टैप करने से फ़ंक्शन ट्रिगर हो सकता है –

उत्तर

25

मैं पहले बिजली संकेत 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 
+0

क्या वॉल्यूम स्तर थ्रेसहोल्ड पर भी पहुंचने पर आप रिकॉर्डिंग बंद कर सकते हैं? जिसका अर्थ है कि यदि कोई वीओआईपी ऐप है, और वार्तालाप पर आग लगने के लिए फायरट्रुक साइरेन नहीं चाहते हैं तो क्या थ्रेसहोल्ड पार हो जाने पर मैं mic को रोक सकता हूं? –

11

उपयोग से कोई जवाब नहीं है: एक अच्छा और आसान कम पास फिल्टर कुछ इस तरह होगा 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;** 
    } 
} 
+0

आप कोड में lowPassResults कहां कॉन्फ़िगर करते हैं? – user513790

+0

अब आप lowPassResults देख सकते हैं। यह सिर्फ misaligned था। क्षमा करें :) –

+0

अच्छे उत्तर के लिए +1 shashank –

13

जब iPhone पर चलाने के लिए, आप [रिकॉर्डर prepareToRecorder]

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
+3

यह मेरे लिए ठीक काम करता है .. – slaveCoder

+2

मैं इस जानकारी को 3 घंटे के लिए देख रहा था। यह अब काम करता है!। – bpolat

+0

ओह भगवान बहुत बहुत धन्यवाद –

2

के बाद निम्नलिखित कोड जोड़ने चाहिए इस प्रयास करें यह मेरे लिए ठीक काम कर रहा है। धन्यवाद @ जिंहुआ लिओ

- (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]; 
} 
} 
संबंधित मुद्दे