iOS: la grabación de audio con AVAudioRecorder falla sin error

Tengo este problema con AVAudioRecorder no funciona para mí, al less por lo que puedo ver (o no puedo escuchar).

Estoy apuntando a iOS 5 con ARC.

Hice los objects de error de configuration, pero ninguno de ellos es despedido, así que supongo que estoy haciendo algo mal aquí.

Aquí está la parte en la que configuré AVAudioRecorder:

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docsDir = [dirPaths objectAtIndex:0]; NSString *soundFilePath = [docsDir stringByAppendingPathComponent:currentTrack.trackFileName]; currentTrack.trackFileURL = [NSURL fileURLWithPath:soundFilePath]; NSLog(@"Chemin : %@", currentTrack.trackFileURL.path); NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; [recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; currentTrack.trackRecordSettings = recordSetting; NSError *err = nil; //[audioSession setDelegate:self]; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } [[AVAudioSession shanetworkingInstance] setActive:YES error:&err]; err = nil; if(err){ NSLog(@"audioSession: %@ %d %@", [err domain], [err code], [[err userInfo] description]); return; } err = nil; recorder = [[AVAudioRecorder alloc] initWithURL:currentTrack.trackFileURL settings:currentTrack.trackRecordSettings error:&error]; if (err) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Warning" message: [err localizedDescription] delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; NSLog(@"error: %@", [error localizedDescription]); } else { [recorder setDelegate:self]; [recorder prepareToRecord]; BOOL audioHWAvailable = [[AVAudioSession shanetworkingInstance]inputIsAvailable ]; if (!audioHWAvailable) { UIAlertView *cantRecordAlert = [[UIAlertView alloc] initWithTitle: @"Warning" message: @"Audio input hardware not available" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [cantRecordAlert show]; return; } } 

No se arrojó ningún error aquí

Luego, cuando sea el momento de comenzar la grabación:

 -(void)startRecordingAudio{ NSLog(@"Start recording"); [[AVAudioSession shanetworkingInstance] setCategory :AVAudioSessionCategoryRecord error:nil]; [recorder record]; } 

Luego, cuando sea el momento de detener la grabación:

 -(void)stopRecordingAudio{ NSLog(@"Stop recording"); [recorder stop]; NSError *err; NSData *audioData = [NSData dataWithContentsOfFile:currentTrack.trackFileURL.path options: 0 error:&err]; if(!audioData) NSLog(@"audio data error: %@ %d %@", [err domain], [err code], [[err userInfo] description]); NSLog(@"%d", audioData.length); } 

¿Es normal que la longitud de audioData sea siempre 4096? Si entiendo bien, es aproximadamente 93 ms de sonido …

Finalmente, cuando es el momento de reproducir el sonido grabado:

 -(void)startPlayingAudio{ [[AVAudioSession shanetworkingInstance] setCategory :AVAudioSessionCategoryPlayback error:nil]; NSLog(@"Start playing"); NSError *error; if(player == nil){ player = [[AVAudioPlayer alloc] initWithContentsOfURL:currentTrack.trackFileURL error:&error]; } player.delegate = self; if (error) NSLog(@"Error: %@", [error localizedDescription]); else [player play]; } 

Configuré methods de delegado que nunca disparan también:

 -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { NSLog (@"audioRecorderDidFinishRecording:successfully:"); } -(void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error { NSLog(@"Decode Error occurnetworking"); } -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully: (BOOL)flag { NSLog (@"audioRecorderDidFinishRecording:successfully: %d", flag); } -(void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error { NSLog(@"Encode Error occurnetworking"); } -(void)beginInterruption{ NSLog(@"INTERRUPT"); } 

Además, vi que el file .caf se creó correctamente en la carpeta de documentos de mi aplicación.

Gracias por cualquier ayuda que puedas aportar. Por ahora no puedo escuchar el sonido grabado y probar usando un dispositivo iPhone 4 sin auriculares.

Se encontró el problema: el logging se llamó antes de prepareRecord. Como estaba usando viewDidAppear para configurar la grabación, la llamada para iniciar la grabación se realizó antes de que la vista estuviera visible …

Utilicé viewDidAppear porque viewDidLoad no se llama ya que no uso initWithNib. Intenté anular loadView, pero todos los ejemplos que encontré no son tan claros sobre el tema y loadView nunca se llama. ¿Tal vez alguien puede apuntarme en la dirección correcta? Sin embargo, puedo escuchar mi voz en el iPhone!

Gracias por tu time.