iPhone: AVAudioPlayer type de file non pris en charge

Mon application télécharge un mp3 de notre server et le rejoue à l'user. Le file est à 64 kbps (ce qui est bien dans la plage acceptable pour l'iPhone si je comprends bien). J'ai cherché comment faire cela sur des dizaines de sites et ils suggèrent tous que je fais exactement ceci:

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithSsortingng:@"http://.../file.mp3"]]; NSError *e = nil; AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error&e]; [player setDelegate:self]; 

Quand je cours le code, le joueur revient null et j'obtiens cette erreur:

 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 

J'ai vérifié le file et je sais que cela fonctionne. Il va jouer sans problèmes sur Windows Media Player, et Quicktime sur mac. J'ai également téléchargé le file sur l'émulateur iPhone et il ne joue aucun problème. Le file est correct, mais pour une raison quelconque, AVAudioPlayer ne l'aime pas.

Y a-t-il quelque chose que je dois changer? Existe-t-il une sorte de paramètre permettant à NSData de spécifier le type de file? Est-ce que quelqu'un a une idée?

    Enfin, j'ai trouvé une solution à ce problème! Au lieu d'initialiser le lecteur audio avec l'object NSData, j'ai enregistré le file dans le dossier Documents, puis initialisé le lecteur avec l'URL du file

     //download file and play from disk NSData *audioData = [NSData dataWithContentsOfURL:someURL]; NSSsortingng *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSSsortingng *filePath = [NSSsortingng ssortingngWithFormat:@"%@/%@.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]; } 

    Lorsque l'application est terminée avec le file, il peut être supprimé. J'espère que son aide plus que moi!

    Nous avions affaire au même problème – nous devions d'abord écrire le file sur le disque. Ce que j'ai finalement trouvé, c'est que datatables que nous téléchargions avaient des octets supplémentaires, blancs au début. Lors de la lecture à partir du disque à l'aide de initWithContentsOfURL , AVAudioPlayer savait comment gérer cela, mais lors du chargement à partir de NSData en utilisant initWithData , ce n'était pas le cas. Le découpage de ces octets l'a corrigé.

    A partir d'iOS 7 AVAudioPlayer a un nouvel initialiseur

     NSError *error; [[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error] 

    Les UTI sockets en charge

     NSSsortingng *const AVFileType3GPP; NSSsortingng *const AVFileType3GPP2; NSSsortingng *const AVFileTypeAIFC; NSSsortingng *const AVFileTypeAIFF; NSSsortingng *const AVFileTypeAMR; NSSsortingng *const AVFileTypeAC3; NSSsortingng *const AVFileTypeMPEGLayer3; NSSsortingng *const AVFileTypeSunAU; NSSsortingng *const AVFileTypeCoreAudioFormat; NSSsortingng *const AVFileTypeAppleM4V; NSSsortingng *const AVFileTypeMPEG4; NSSsortingng *const AVFileTypeAppleM4A; NSSsortingng *const AVFileTypeQuickTimeMovie; NSSsortingng *const AVFileTypeWAVE; 

    Si le nom de votre produit contient de l'espace, vous recevrez l'erreur.
    Le nom de mon projet était: Panorama 1453 TR. initWithContentsOfURL méthode initWithContentsOfURL ne peut pas initWithContentsOfURL le path du file. donc ça ne fonctionnait pas. vous pouvez mettre un breakPoint à NSURL *fileURL = . Après une étape, vous pouvez voir fileURL ce que datatables ont.
    Je suis passé à Panorama1453TR, ça a marché.