AVAudioplayer播放音频时报错 Error Domain=NSOSStatusErrorDomain Code=1954115647 "(null)"

AVAudioplayer播放音频时报错 

Error Domain=NSOSStatusErrorDomain Code=1954115647 "(null)"


AVAudioplayer 有两个初始化方法:

1[[AVAudioPlayer alloc] initWithData:musicData error&e];

2[[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error];

第一种是使用将音频文件的data文件初始化,但是data必须是一个完整的文件。

第二种是从url获取,但是这里的url是本地的file URL

 

 所以AVAudioplayer无法直接从网络url上获取音频文件,所以可以用:

data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://.../file.mp3"]];

将网络上音频down下来,再用initWithData初始化player但是这样down下来的文件有时是不完整的,所以出现创建失败问题,出现:

Error Domain=NSOSStatusErrorDomain Code=1954115647


解决一:data保存在本地,在通过initWithContentsOfURL,找到该文件,这样就可以成功创建了。

整个流程为:

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


解决二:有个简单的办法,initWithData: fileTypeHint: error:

用这个,指定类型(比如MP3就用AVFileTypeMPEGLayer3

NSError *playerError = nil;

    _soundPlayer = [[AVAudioPlayeralloc] initWithData:dataerror:&playerError];

    if (playerError && playerError.code ==1954115647) {

        _soundPlayer = [[AVAudioPlayeralloc] initWithData:datafileTypeHint:AVFileTypeMPEGLayer3error:&playerError];

    }

你可能感兴趣的:(iOS)