reproducir - iPhone: AVAudioPlayer tipo de archivo no compatible
ver archivos iphone en pc (4)
Mi aplicación descarga un mp3 de nuestro servidor y lo reproduce para el usuario. El archivo es de 64 kbps (lo cual está dentro del rango aceptable para el iPhone si lo entiendo correctamente) He buscado cómo hacer esto en docenas de sitios y todos sugieren que hago exactamente esto:
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];
NSError *e = nil;
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e];
[player setDelegate:self];
Cuando ejecuto el código, el reproductor vuelve a ser nulo y aparece este error:
2011-02-04 10:44:46.176 MyApp[6052:207] Error loading audio: Error Domain=NSOSStatusErrorDomain Code=1954115647 "The operation couldn’t be completed. (OSStatus error 1954115647.)"
2011-02-04 10:44:49.647 MyApp[6052:207] unsupported file type
He comprobado el archivo y sé que funciona. Se reproducirá sin problemas en Windows Media Player y Quicktime en mac. También he cargado el archivo en el emulador de iPhone y se reproduce sin problemas. El archivo está bien, pero por alguna razón a AVAudioPlayer no le gusta.
¿Hay algo que necesito cambiar? ¿Hay algún tipo de configuración para que NSData especifique qué tipo de archivo es? ¿Alguien tiene alguna idea?
¡Por fin he encontrado una solución a este problema! En lugar de inicializar el reproductor de audio con el objeto NSData, guardé el archivo en la carpeta Documentos y luego inicialicé el reproductor con la URL del archivo
//download file and play from disk
NSData *audioData = [NSData dataWithContentsOfURL:someURL];
NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *filePath = [NSString stringWithFormat:@"%@/%@.mp3", docDirPath , fileName];
[audioData writeToFile:filePath atomically:YES];
NSError *error;
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];
if (player == nil) {
NSLog(@"AudioPlayer did not load properly: %@", [error description]);
} else {
[player play];
}
Cuando la aplicación se realiza con el archivo, se puede eliminar. Espero que su ayuda sea más que solo yo!
Desde iOS 7 AVAudioPlayer tiene nuevo inicializador
NSError *error;
[[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]
Las ITU soportadas
NSString *const AVFileType3GPP;
NSString *const AVFileType3GPP2;
NSString *const AVFileTypeAIFC;
NSString *const AVFileTypeAIFF;
NSString *const AVFileTypeAMR;
NSString *const AVFileTypeAC3;
NSString *const AVFileTypeMPEGLayer3;
NSString *const AVFileTypeSunAU;
NSString *const AVFileTypeCoreAudioFormat;
NSString *const AVFileTypeAppleM4V;
NSString *const AVFileTypeMPEG4;
NSString *const AVFileTypeAppleM4A;
NSString *const AVFileTypeQuickTimeMovie;
NSString *const AVFileTypeWAVE;
Estábamos tratando el mismo problema: primero teníamos que escribir el archivo en el disco. Lo que encontré finalmente fue que los datos que estábamos descargando tenían bytes adicionales en blanco al principio. Al leer desde el disco usando initWithContentsOfURL
, AVAudioPlayer sabía cómo manejar esto, pero al cargar desde NSData usando initWithData
, no lo hizo. Recortando esos bytes lo arreglamos.
Si el nombre de su producto contiene espacio, recibirá el error.
El nombre del producto de mi proyecto era: Panorama 1453 TR. initWithContentsOfURL
método initWithContentsOfURL
no puede recuperar la ruta del archivo. así que no estaba funcionando. puede poner un breakPoint en NSURL *fileURL =
. Después de un paso puedes ver fileURL qué datos tiene.
Cambié a Panorama1453TR, funcionó.