我的应用程序从我们的服务器下载一个mp3并将其播放回用户。该文件为64 kbps(如果我理解正确,这完全在iPhone的可接受范围内)。我已经查询了如何在数十个网站上执行此操作,他们都建议我这样做:
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是否有某种设置来指定它是什么类型的文件?有没有人有任何想法?
答案 0 :(得分:31)
最后我找到了解决这个问题的方法!我没有使用NSData对象初始化音频播放器,而是将文件保存到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];
}
当应用程序完成该文件后,可以将其删除。希望他的帮助不仅仅是我!
答案 1 :(得分:12)
我们正在处理同样的问题 - 我们必须先将文件写入磁盘。我最终发现,我们下载的数据在开始时有额外的空白字节。当使用initWithContentsOfURL
从磁盘读取时,AVAudioPlayer知道如何处理这个问题,但是当使用initWithData
从NSData加载时,它没有。修剪这些字节修复它。
答案 2 :(得分:11)
从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;
答案 3 :(得分:1)
如果您的产品名称包含空格,您将收到错误。
我的项目产品名称为:Panorama 1453 TR。 initWithContentsOfURL
方法无法获取文件路径。所以它没有用。
你可以把breakPoint放到NSURL *fileURL =
。在一个步骤之后,您可以看到fileURL有哪些数据。
我改为Panorama1453TR,它确实有效。