Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone:AVAudioPlayer不支持的文件类型_Iphone_Ios_Mp3_Avaudioplayer - Fatal编程技术网

iPhone:AVAudioPlayer不支持的文件类型

iPhone:AVAudioPlayer不支持的文件类型,iphone,ios,mp3,avaudioplayer,Iphone,Ios,Mp3,Avaudioplayer,我的应用程序从我们的服务器下载mp3,并将其播放给用户。该文件为64 kbps(如果我理解正确,这在iPhone的可接受范围内)。我在几十个网站上查阅了如何做到这一点,他们都建议我做到这一点: NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]]; NSError *e = nil; AVAudioPlayer *player = [[AVAudioPlayer all

我的应用程序从我们的服务器下载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];
当我运行代码时,player返回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 emulator上,它的播放没有任何问题。该文件很好,但出于某些原因,AVAudioPlayer不喜欢它


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

我终于找到了解决这个问题的办法!我没有用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];
}

应用程序处理完文件后,可以将其删除。希望他的帮助不仅仅是我

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

如果您的产品名称包含空格,您将收到错误。
我的项目的产品名称是:Panorama 1453 TR。
initWithContentsOfURL
方法无法获取文件路径。所以它不起作用。 您可以将断点放在
NSURL*fileURL=
上。完成一个步骤后,您可以看到fileURL包含哪些数据。

我改为Panorama1453TR,它确实起作用了。

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;

哦,那很有趣。也许这应该作为一个bug提交给苹果?最后,我还是选择了保存的文件,因为它更适合我们要做的事情。谢谢你的提示!您如何确切地知道要修剪哪些字节以及您是如何做到的?@typeoneerror:我取了一个特定的文件,用十六进制编辑器查看它,然后阅读mp3规范,以了解头是如何定义的。就在那时,我注意到了这种差异。不太一般,我知道。。。通过编程,您可以查看NSData的第一个字节并跳过任何0。@Don,我在编辑器中查看并注意到第一个字节中的大部分是0,但不是全部。我怎么知道什么时候可以安全地跳过?@user592419查看,其中描述了mp3帧,第一帧应该设置了前11个字节。我不是一个音频专家,我已经有一段时间没有看这个了,但也许试着寻找第一帧,忽略它之前的一切。我想知道这是否有效。谢谢。你的回答对我帮助很大!回答得很好,谢谢!在某些方面,它似乎是iOS 9的拯救解决方案。。。