Не удается получить уровень звука микрофона

#avfoundation #core-audio #ios8 #xcode6 #beta

#avfoundation #ядро-аудио #ios8 #xcode6 #бета

Вопрос:

Я пытался получить уровень громкости микрофона следующим образом: в заголовочном файле:

 #import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>

@interface AlarmViewController : UIViewController {
    AVAudioRecorder *recorder;
    NSTimer *levelTimer;
}

@property (strong, nonatomic) IBOutlet UISegmentedControl *segmentedControl;
@property (strong, nonatomic) IBOutlet UILabel *timeLabel;

- (void)timeChange:(NSTimer *)timer;
- (void)levelTimerCallback:(NSTimer *)timer;

@end
  

в файле реализации:

 - (void)viewDidLoad
{
    [super viewDidLoad];

    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:amp;error];
    if (recorder) {
        [recorder prepareToRecord];
        recorder.meteringEnabled = YES;
        [recorder record];
        levelTimer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(levelTimerCallback:) userInfo:nil repeats:YES];
    }
    else {
        NSLog(@"%@", [error description]);
    }
}

- (void)levelTimerCallback:(NSTimer *)timer {
    [recorder updateMeters];
    NSLog(@"Average input: %f Peak input: %f", [recorder averagePowerForChannel:0], [recorder peakPowerForChannel:0]);
}
  

Итак, в журнале он возвращает следующее:

 2014-06-29 16:31:42.400 NightLight[1140:388914] Average input: -120.000000 Peak input: -120.000000
  

Я не знаю, что мне делать? Я уверен, что в настройках конфиденциальности iPhone разрешено использовать микрофон.

Ответ №1:

Оказывается, вам нужно использовать AVAudioSession для установки контекста для приложения. Добавьте следующий код в — (void)viewDidLoad после [super viewDidLoad];

 // Set audio context to app
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[audioSession setActive:YES error:nil];