Pergunta

Eu estou tentando configurar um controlador básico que irá gravar a entrada de áudio do usuário (voz). No entanto, o método prepareToRecord do AVAudioRecorder está falhando e eu não consigo descobrir o porquê. Tenho a configuração da sessão de áudio no meu delegado app e eu não receber um erro quando eu instanciar a instância AVAudioRecorder:

// App delegado trecho

AVAudioSession* audioSession = [AVAudioSession sharedInstance];
NSError* audioSessionError   = nil;

[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord
                  error: &audioSessionError];

  if (audioSessionError) {
    NSLog (@"Error setting audio category: %@", [audioSessionError localizedDescription]); 
} else {
  NSLog(@"No session errors for setting category");
}

[audioSession setActive:YES error:&audioSessionError];

if (audioSessionError) {
  NSLog (@"Error activating audio session: %@", [audioSessionError localizedDescription]); 
} else {
NSLog(@"no session errors for setActive");
}

// VISTA foi carregado IN RECORDERCONTROLLER

- (void)viewDidLoad {

self.navigationItem.title = [NSString stringWithFormat:@"%@", [[MyAppDelegate loadApplicationPlist] valueForKey:@"recorderViewTitle"]];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone 
                                                                                     target:self 
                                                                                     action:@selector(dismiss)];

[self alertIfNoAudioInput];

 [self createAVAudioRecorder];

 minutesSecondsFormatter = [[SimpleMinutesSecondsFormatter alloc] init];
currentTimeUpdateTimer  = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                        target:self selector:@selector(updateAudioDisplay)
                                                       userInfo:NULL repeats:YES];

[super viewDidLoad];
}

// cria AVAUDIORECORDER

- (NSError *)createAVAudioRecorder {

NSError *recorderSetupError = nil;

 [audioRecorder release];
audioRecorder = nil;

 NSString *timestamp = [NSString stringWithFormat:@"%d", (long)[[NSDate date] timeIntervalSince1970]];

 NSString *destinationString = [[MyAppDelegate getAppDocumentsDirectory] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.caf", timestamp]];
 NSLog(@"destinationString: %@", destinationString);
 NSURL *destinationUrl       = [NSURL fileURLWithPath: destinationString];

 audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationUrl 
                                          settings:[[AVRecordSettings sharedInstance] getSettings] 
                                             error:&recorderSetupError];

if (recorderSetupError) {

   UIAlertView *cantRecordAlert =
    [[UIAlertView alloc] initWithTitle:@"Can't record"
                           message:[recorderSetupError localizedDescription]
                          delegate:nil
                 cancelButtonTitle:@"OK"
                 otherButtonTitles:nil];
    [cantRecordAlert show];
    [cantRecordAlert release];
    return recorderSetupError;
} else {
  NSLog(@"no av setup error");
}

if ([audioRecorder prepareToRecord]) {
  recordPauseButton.enabled = YES;
  audioRecorder.delegate    = self;
 } else {
  NSLog(@"couldn't prepare to record");
 }

 NSLog (@"recorderSetupError: %@", recorderSetupError);

 return recorderSetupError;
 }
Foi útil?

Solução

Ele está falhando porque você não inicializar o objeto AVAudioRecorder usando as configurações adequadas. Faça isso antes de inicializar-lo:

    NSDictionary *recordSettings =
    [[NSDictionary alloc] initWithObjectsAndKeys:
     [NSNumber numberWithFloat: 44100.0],                 AVSampleRateKey,
     [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
     [NSNumber numberWithInt: 1],                         AVNumberOfChannelsKey,
     [NSNumber numberWithInt: AVAudioQualityMax],         AVEncoderAudioQualityKey,
     nil];

então você pode instanciá-lo utilizando

audioRecorder = [[AVAudioRecorder alloc] initWithURL:destinationUrl 
                                          settings:recordSettings
                                             error:&recorderSetupError];

Outras dicas

O prepareToRecord também falha (silenciosamente, sem um erro) se o diretório onde você tenta salvar o arquivo não existe. Use NSFileManager para verificar se o diretório já existe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top