Initialization error: The operation couldn’t be completed. (OSStatus error 1685348671.)
问题代码:
- (void)playAvPlayer:(NSString *)localPath {
NSURL *url = [NSURL fileURLWithPath:localPath];
NSError *error = nil;
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
if (error) {
NSLog(@"Initialization error: %@", error.localizedDescription);
}
self.player.delegate = self;
[self.player prepareToPlay];
[self.player play];
}
无法成功创建player
报错内容如下:
Problem scanning for packets
MPEGAudioFile::OpenFromDataSource failed
OpenFromDataSource failed
Open failed
Initialization error: The operation couldn’t be completed. (OSStatus error 1685348671.)
问题排查:
从server下载的音频文件没有后缀,
app下载逻辑是如果没有后缀,添加mp3作文文件名后缀保存到本地。
但是如果音频本来是wav格式的,保存文件名为mp3作为后缀,就打不开。
只有正确的文件名后缀,才可以正常播放。
那么怎么知道下载的音频文件是mp3格式还是wav格式?
通过
[request setHTTPMethod:@"HEAD"];
这样就可以快速获取响应头。无需等文件下载。
通过url获取生成本地文件名,下载前判断如果本地文件存在,不下载,如果不存在则下载。
则是需要同步的直接的就可以通过url获取文件名。通过先取head头部得到文件格式的方式效率不高。
最后解决方法:
NSURL *url = [NSURL fileURLWithPath:localPath];
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:url];
AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil];
self.player=[[AVAudioPlayer alloc] initWithData:data error:&error];
if (error) {
NSLog(@"Initialization error: %@", error.localizedDescription);
}
self.player.delegate = self;
[self.player prepareToPlay];
[self.player play];
ok,可以了音频文件可以播放,即使wav保存mp3文件名后缀也没问题。
网友评论