iOS: la reproducción del audio grabado falla con el error OSStatus -43 (archivo no encontrado)
Configuré una instancia de AVAudioRecorder de la siguiente manera cuando se carga mi vista:
<code>AVAudioSession *audioSession = [AVAudioSession sharedInstance]; audioSession.delegate = self; [audioSession setActive:YES error:nil]; [audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; NSString *tempDir = NSTemporaryDirectory(); NSString *soundFilePath = [tempDir stringByAppendingPathComponent:@"sound.m4a"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; NSLog(@"%@", soundFileURL); NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:kAudioFormatMPEG4AAC], AVFormatIDKey, [NSNumber numberWithInt:AVAudioQualityMin], AVEncoderAudioQualityKey, [NSNumber numberWithInt:16], AVEncoderBitRateKey, [NSNumber numberWithInt: 1], AVNumberOfChannelsKey, [NSNumber numberWithFloat:8000.0], AVSampleRateKey, [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey, nil]; NSError *error = nil; self.recorder = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error]; self.recorder.delegate = self; if (error) { NSLog(@"error: %@", [error localizedDescription]); } else { [self.recorder prepareToRecord]; } </code>
Luego, cuando el usuario presiona el botón de grabar hago:
<code>- (IBAction)record:(id)sender { if (!self.isRecording) { self.isRecording = YES; [self.recorder record]; self.recordButton.enabled = NO; } } </code>
Luego para detener la grabación / reproducción:
<code>- (IBAction)stop:(id)sender { if (self.isRecording) { [self.recorder stop]; self.recordButton.enabled = YES; self.isRecording = NO; } if (self.isPlaying) { [self.player stop]; self.isPlaying = NO; self.playButton.enabled = YES; } } </code>
Después, quiero poder reproducir lo que se grabó, así que hago lo siguiente:
<code>- (IBAction)play:(id)sender { NSError *error = nil; self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:self.recorder.url error:&error]; self.player.delegate = self; if (error) { NSLog(@"%@", error.localizedDescription); } else { self.isPlaying = YES; [self.player play]; self.playButton.enabled = NO; } } </code>
Pero cuando voy a reproducir el archivo es conseguirError de estado del sistema operativo -43 archivo no encontrado.
Todo esto se está ejecutando en el dispositivo por cierto, en el simulador y se produce un error al intentar crear una instancia de la grabadora o el reproductor, y por lo visto, es un problema del simulador.
EDITAR 1: Resolví el error OSStatus -43 parte que tiene algo que ver con el formato de codificación, comenté el formato y grabé y reproducí el archivo correctamente, pero necesito grabar en un formato comprimido. ¿Alguien sabe la configuración para esto?
EDIT 2: Me las arreglé para encontrar la configuración que funcionaba para audio AAC comprimido. Un archivo de audio de 2min sale a 256KB, actualicé mi código para reflejar el estado actual. Gracias a todos los que respondieron por vuestra ayuda.