¿Por qué AVAudioPlayer no se puede inicializar? ¿Con el error OSStatus 1685348671?

Estoy grabando audio en un controller de vista (una nota de voz). Esto funciona. Puedo reproducir el audio grabado siempre que el usuario no descarte el controller de vista.

Sin embargo, si el usuario desecha el controller de vista y abre el controller de vista nuevamente, la initialization del AVAudioPlayer falla con el error de estado 1685348671.

También intenté iniciar el reproductor con NSData: NSData *data = [[NSData alloc] initWithContentsOfURL:_outputFileURL]; _player = [[AVAudioPlayer alloc] initWithData:data error:&error2]; NSData *data = [[NSData alloc] initWithContentsOfURL:_outputFileURL]; _player = [[AVAudioPlayer alloc] initWithData:data error:&error2]; , pero eso tampoco funcionaría

He intentado .caf, seguí todos los tutoriales, pero de alguna manera no puedo hacer que funcione … Este error parece referirse a un file no válido, aunque no estoy seguro. Sin embargo, si descargo la aplicación en el Organizador y la abro en mi Mac, puedo reproducirla, por lo que el file en sí no está dañado.

Aquí está mi método de logging:

 - (IBAction)recordPauseTapped:(id)sender { // Stop the audio player before recording if (_player.playing) { [_player stop]; } if (!_recorder.recording) { AVAudioSession *session = [AVAudioSession shanetworkingInstance]; [session setActive:YES error:nil]; // Start recording [_recorder record]; [recordPauseButton setTitle:@"Pause" forState:UIControlStateNormal]; } else { // Pause recording [_recorder pause]; [recordPauseButton setTitle:@"Aufnahme" forState:UIControlStateNormal]; } [stopButton setEnabled:YES]; [playButton setEnabled:NO]; } 

La grabación funciona y el file existe en el directory de Documentos.

Aquí está mi método de reproducción, que funciona si el file se grabó inmediatamente antes, sin que el usuario abandone el controller de vista:

 - (IBAction)playTapped:(id)sender { if (!_recorder.recording){ AVAudioSession *audioSession = [AVAudioSession shanetworkingInstance]; [audioSession setActive:YES error:nil]; NSError *error; BOOL success = [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; if(!success) { NSLog(@"error doing outputaudioportoverride - %@", [error localizedDescription]); } NSError *error2; NSLog(@"_outputFileURL: %@", _outputFileURL); _player = [[AVAudioPlayer alloc] initWithContentsOfURL:_outputFileURL error:&error2]; if (error2) { NSLog(@"error initialising player - %@", [error2 localizedDescription]); } [_player setDelegate:self]; [_player play]; } } 

Y aquí está mi vista: DidLoad:

 - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.navigationBar.translucent = NO; [stopButton setEnabled:NO]; // Set the audio file if ([_audioFileName isEqualToString:@""]) { NSString *guid = [[NSUUID new] UUIDString]; _audioFileName = [NSString stringWithFormat:@"audio-%@.m4a", guid]; [playButton setEnabled:NO]; } else { [playButton setEnabled:YES]; } NSLog(@"_audioFileName: %@", _audioFileName); NSArray *pathComponents = [NSArray arrayWithObjects: [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject], _audioFileName, nil]; _outputFileURL = [NSURL fileURLWithPathComponents:pathComponents]; // Setup audio session AVAudioSession *session = [AVAudioSession shanetworkingInstance]; [session setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [session setActive:YES error:nil]; // Define the recorder setting NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init]; [recordSetting setValue:[NSNumber numberWithInt:kAudioFormatMPEG4AAC] forKey:AVFormatIDKey]; [recordSetting setValue:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey]; [recordSetting setValue:[NSNumber numberWithInt: 2] forKey:AVNumberOfChannelsKey]; // Initiate and prepare the recorder _recorder = [[AVAudioRecorder alloc] initWithURL:_outputFileURL settings:recordSetting error:nil]; _recorder.delegate = self; _recorder.meteringEnabled = YES; [_recorder prepareToRecord]; } 

Tu problema es que tienes [_recorder prepareToRecord]; en viewLoad, lo que significa que se sobrescribirá cada vez que cargue el controller de vista. Si no desea este comportamiento, debe eliminar esta línea y colocarla al comienzo de recordPauseTapped, por ejemplo. Eso debería arreglar tus problemas.