iPhone:AVAudioPlayer不受支持的文件types

我的应用程序从我们的服务器下载一个MP3并播放给用户。 该文件是64 kbps(如果我理解正确,这是在iPhone的可接受的范围内)。 我已经查找了如何在几十个网站上做到这一点,他们都build议我这样做:

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

当我运行代码时,播放器返回null,我得到这个错误:

 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 

我已经检查了这个文件,我知道它的工作原理。 它将在Windows Media Player和Mac上的Quicktime上播放。 我也上传了文件到iPhone模拟器,它没有任何问题。 该文件是好的,但由于某种原因AVAudioPlayer不喜欢它。

有什么我需要改变? 是否有某种NSData的设置来指定它是什么types的文件? 有人有什么主意吗?

终于,我find了解决这个问题的办法! 我没有用NSData对象初始化audio播放器,而是将文件保存到Documents文件夹,然后用文件URL初始化播放器

 //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]; } 

当应用程序完成该文件,它可以被删除。 希望他的帮助不仅仅是我!

我们正在处理同样的问题 – 我们必须先将文件写入磁盘。 我最终发现的是,我们下载的数据在开始时有额外的空白字节。 当使用initWithContentsOfURL从磁盘读取时,AVAudioPlayer知道如何处理这个,但是当使用initWithData从NSData加载时,它不会。 修剪这些字节固定它。

从iOS 7 AVAudioPlayer有新的初始化程序

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

支持的UTI

 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; 

如果您的产品名称包含空格,您将收到错误。
我的项目产品名称是:Panorama 1453 TR。 initWithContentsOfURL方法不能获取文件path。 所以它不工作。 你可以把一个breakPoint放到NSURL *fileURL = 。 一步之后,你可以看到fileURL有什么数据。
我改为Panorama1453TR,它确实工作。