2015-02-11 4 views
1

Я пытаюсь отобразить уровень децибела входящего звука через iPhone-микрофон, все работает в симуляторе, но не работает на реальном устройстве iOS. Это как iPhone не обнаруживает звук, вот мой код:Мониторинг текущего уровня дБ в Objective-C

- (void)viewDidLoad { 
    [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
     if (granted) { 
      [self setup]; 

      NSLog(@"granted"); 
     } else { 
      NSLog(@"denied"); 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Microphone Access Denied" 
                  message:@"You must allow microphone access in Settings > Privacy > Microphone" 
                  delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil]; 
      [alert show]; 
     } 
    }]; 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 


- (void)setup { 

    // record audio to /dev/null 
    NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 

    // some settings 
    NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
           [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
           [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
           [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
           nil]; 

    // create a AVAudioRecorder 
    NSError *error; 
    self.recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; 
    [self.recorder setMeteringEnabled:YES]; 

    if (self.recorder) { 
     [self.recorder prepareToRecord]; 
     self.recorder.meteringEnabled = YES; 
     [self.recorder record]; 
     self.levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector: @selector(levelTimerCallback:) userInfo: nil repeats: YES]; 
     [self.recorder updateMeters]; 

    } 
} 

- (void)levelTimerCallback:(NSTimer *)timer { 
    [self.recorder updateMeters]; 

    // here is the DB! 
    float peakDecebels = [self.recorder peakPowerForChannel:1]; 
    NSLog(@"peak: %f", peakDecebels); 
    float avaeragePower = [self.recorder averagePowerForChannel:1]; 
    NSLog(@"averagePower: %f", avaeragePower); 

    [self.dbLabel setText:[NSString stringWithFormat:@"db %f",peakDecebels]]; 
} 

ответ

1

Вам необходимо установить звуковую сессию соответствующим образом:

NSError* error = nil; 
    BOOL success = [[AVAudioSession sharedInstance]  
          setCategory:AVAudioSessionCategoryRecord 
            error:&error]; 
    if (!success && error) { 
     NSLog(@"error %@",error); 
    } 

Это должно быть сделано, прежде чем начать запись.

+0

Отлично, спасибо. – Leethal