iPhone:AVAudioPlayer不支持的文件类型

mtm*_*ock 26 iphone mp3 avaudioplayer ios

我的应用程序从我们的服务器下载一个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];
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,播放器返回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
Run Code Online (Sandbox Code Playgroud)

我检查了文件,我知道它有效.它将在Windows Media Player和Mac上的Quicktime上没有问题.我还将文件上传到iPhone模拟器,它没有任何问题.该文件很好,但由于某种原因AVAudioPlayer不喜欢它.

有什么我需要改变的吗?NSData是否有某种设置来指定它是什么类型的文件?有谁有想法吗?

mtm*_*ock 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];
}
Run Code Online (Sandbox Code Playgroud)

当应用程序完成该文件后,可以将其删除.希望他的帮助不仅仅是我!


Don*_*Don 12

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

  • @typeoneerror:我拿了一个特定的文件,用十六进制编辑器查看它并阅读mp3规范以查看标头是如何定义的.就在那时我注意到了这种差异.不是很一般,我知道......从编程方面来说,你可以查看NSData的第一个字节并跳过任何0. (3认同)
  • 你究竟知道要修剪哪些字节以及你是如何做到的? (2认同)

小智 11

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

NSError *error;
[[AVAudioPlayer alloc] initWithData:soundData fileTypeHint:AVFileTypeMPEGLayer3 error:&error]
Run Code Online (Sandbox Code Playgroud)

支持的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;
Run Code Online (Sandbox Code Playgroud)