Graba audio y guarda permanentemente en iOS

He creado 2 aplicaciones para iPhone que pueden grabar audio y guardarlo en un archivo y reproducirlo de nuevo.

Uno de ellos usa AVAudiorecorder y AVAudioplayer. El segundo es el ejemplo de SpeakHere de Apple con Audio Queues.

Ambos funcionan tanto en Simulater como en el dispositivo.

¡¡PERO cuando reinicio cualquiera de las aplicaciones, el archivo grabado no se encuentra !!! ¡He intentado todas las sugerencias posibles encontradas en stackoverflow pero todavía no funciona!

Esto es lo que uso para guardar el archivo:

NSArray *dirPaths; NSString *docsDir; dirPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound1.caf"]; NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath]; 

Ok, finalmente lo resolví. El problema fue que estaba configurando el AVAudioRecorder y archivé la ruta en viewLoad de mi ViewController.m sobrescribiendo los archivos existentes con el mismo nombre.

  1. Después de grabar y guardar el audio en un archivo y detener la aplicación, pude encontrar el archivo en Finder. (/ Users / xxxxx / Library / Application Support / iPhone Simulator / 6.0 / Applications / 0F107E80-27E3-4F7C-AB07-9465B575EDAB / Documents / sound1.caf)
  2. Cuando reinicié la aplicación, el código de configuración de la grabadora (de viewLoad) simplemente sobrescribía mi antiguo archivo llamado:

    sound1.caf

  3. con uno nuevo Mismo nombre pero sin contenido.

  4. La reproducción solo reproducirá un nuevo archivo vacío. -> Sin sonido, obviamente.


Así que aquí está lo que hice:

Utilicé NSUserdefaults para guardar la ruta del nombre del archivo grabado que se recuperará más adelante en mi método playBack.


Clean viewLoad en ViewController.m:

 - (void)viewDidLoad { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; [audioSession setActive:YES error:nil]; [recorder setDelegate:self]; [super viewDidLoad]; } 

registro editado en ViewController.m:

 - (IBAction) record { NSError *error; // Recording settings NSMutableDictionary *settings = [NSMutableDictionary dictionary]; [settings setValue: [NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [settings setValue: [NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey]; [settings setValue: [NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey]; [settings setValue: [NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey]; [settings setValue: [NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey]; [settings setValue: [NSNumber numberWithInt: AVAudioQualityMax] forKey:AVEncoderAudioQualityKey]; NSArray *searchPaths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath_ = [searchPaths objectAtIndex: 0]; NSString *pathToSave = [documentPath_ stringByAppendingPathComponent:[self dateString]]; // File URL NSURL *url = [NSURL fileURLWithPath:pathToSave];//FILEPATH]; //Save recording path to preferences NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setURL:url forKey:@"Test1"]; [prefs synchronize]; // Create recorder recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; [recorder prepareToRecord]; [recorder record]; } 

reproducción editada en ViewController.m:

 -(IBAction)playBack { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; [audioSession setActive:YES error:nil]; //Load recording path from preferences NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; temporaryRecFile = [prefs URLForKey:@"Test1"]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil]; player.delegate = self; [player setNumberOfLoops:0]; player.volume = 1; [player prepareToPlay]; [player play]; } 

y agregó un nuevo método dateString a ViewController.m:

 - (NSString *) dateString { // return a formatted string for a file name NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"ddMMMYY_hhmmssa"; return [[formatter stringFromDate:[NSDate date]] stringByAppendingString:@".aif"]; } 

Ahora puede cargar el último archivo grabado a través de NSUserdefaults y cargarlo con:

  //Load recording path from preferences NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; temporaryRecFile = [prefs URLForKey:@"Test1"]; player = [[AVAudioPlayer alloc] initWithContentsOfURL:temporaryRecFile error:nil]; 

en (IBAction) playBack. temporaryRecFile es una variable NSURL en mi clase ViewController.

declarado como siguiente ViewController.h:

 @interface SoundRecViewController : UIViewController  { ...... ...... NSURL *temporaryRecFile; AVAudioRecorder *recorder; AVAudioPlayer *player; } ...... ...... @end