EDIT: ¡Lo descubrí! Estaba guardando la cadena absoluta de la URL, y cuando intenté inicializar el reproductor de audio, utilicé [NSURL fileURLWithPath: nombre]; cuando debería haber sido [NSURL urlWithString: nombre]. Al crear otro archivoURLWithPath, estaba cambiando la ruta y no funcionaría. Voy a dejar esto por un código de muestra, supongo!Guardar URL de grabación en datos básicos, pero no funciona cuando intento usarlo más tarde
Bien, entonces tengo una pieza de audio grabada del usuario en mi aplicación. Quiero que el usuario pueda guardar estas grabaciones, así que pensé que debería guardar la cadena de la url de la grabación en los datos centrales, buscar la url y cargar un AVAudioPlayer con esa url. Pero no funciona.
Me da:
Error in audioPlayer: The operation could not be completed.
Esta es la NSString de la URL:
file://localhost/file:/localhost/var/mobile/Applications/E09081DE-434F-46CA-A598-
A2470973C0F1/Documents/Rang%2520De%2520sound.caf
Tengo la sensación de que tiene algo que ver con el hecho de que se ahorra en localhost, y yo no puede acceder a ese archivo cuando intenta inicializar el reproductor de audio. Pero no estoy seguro. Sé que se puede acceder a la URL de inmediato, porque después de grabar puedo reproducir la grabación usando esa URL.
Cómo estoy guardando la grabación:
- (IBAction)saveRecording
{
rapAppDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context =
[appDelegate managedObjectContext];
NSManagedObject *newSong;
newSong = [NSEntityDescription
insertNewObjectForEntityForName:@"URLRecordings"
inManagedObjectContext:context];
NSError *error;
NSURL *urlOfRecording = audioRecorder.url;
NSString *urla = [urlOfRecording absoluteString];
NSLog(@"in saveRecording, the url is: %@",urla);
[newSong setValue:urla forKey:@"urlOfSong"];
[context save:&error];
status.text = @"Song Saved!";
}
Cuando me lo trae, los cambios de URL! ¡No entiendo por qué! Mire:
2012-08-03 16:31:17.434 Rap To Beats[5054:707] in saveRecording, the url is: file://localhost/var/mobile/Applications/E09081DE-434F-46CA-A598-A2470973C0F1/Documents/Le%20Gayi%20sound.caf
2012-08-03 16:31:24.381 Rap To Beats[5054:707] after fetch, the url is: file://localhost/file:/localhost/var/mobile/Applications/E09081DE-434F-46CA-A598-A2470973C0F1/Documents/Le%2520Gayi%2520sound.caf
¡Pasó de Le% 20 a Le% 2520! No volví a grabar ni nada. Simplemente guardé la misma cadena en los datos básicos y la busqué. También hay algunos cambios en el localhost al principio.
Entonces esta es la forma en que estoy de obtenerlo:
rapAppDelegate *appDelegate =
[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context =
[appDelegate managedObjectContext];
NSEntityDescription *entityDesc =
[NSEntityDescription entityForName:@"URLRecordings"
inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"urlOfSong" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[context
executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
[self setUrlArray:mutableFetchResults];
Cualquier ayuda sobre cómo solucionar estos chicos? Si tiene que ver con el host local, ¿cómo lo guardo en otro lugar?
Aquí está el código en donde se guarda:
NSArray *dirPaths;
NSString *docsDir;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
NSString *name = self.beatName.text;
NSString *soundFilePath1 = [docsDir
stringByAppendingPathComponent:name];
NSString *soundFilePath = [soundFilePath1
stringByAppendingString:@" sound.caf"];
NSLog(@"in viewDidLoad, the url is: %@",soundFilePath);
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
NSDictionary *recordSettings = [NSDictionary
dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:AVAudioQualityMin],
AVEncoderAudioQualityKey,
[NSNumber numberWithInt:16],
AVEncoderBitRateKey,
[NSNumber numberWithInt: 2],
AVNumberOfChannelsKey,
[NSNumber numberWithFloat:44010.0],
AVSampleRateKey,
nil];
NSError *error = nil;
audioRecorder = [[AVAudioRecorder alloc]
initWithURL:soundFileURL
settings:recordSettings
error:&error];
if (error)
{
NSLog(@"error: %@", [error localizedDescription]);
} else {
[audioRecorder prepareToRecord];
}
siento por la duración de esta pregunta, sólo quieren ser lo más útil posible y poner cualquier código que podría ayudar a resolver el problema. ¡Avíseme si es algo diferente que estoy haciendo incorrectamente! ¡Gracias chicos!
Como una cuestión de protocolo, debe copiar su respuesta, enviarla como respuesta, luego aprobarla (seleccionarla) para cerrar esta pregunta. –
bien, lo haré! – gg13