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]; }
局限性:recorder,player簡單易用,但是有局限性。
對我項目影響最大的是,多次錄音時,並播放時,會出現文件錯誤。
在繼續利用recorder,player的前提下,就需要將每次錄音完成的文件進行數據追加。
if ([[NSFileManager defaultManager] fileExistsAtPath:臨時音頻路徑) { NSData *tempAudioData = [[NSData alloc] initWithContentsOfFile:臨時音頻路徑]; if ([[NSFileManager defaultManager] fileExistsAtPath:音頻路徑]) { NSMutableData *newAudioData = [NSMutableData data]; NSData *audioData = [[NSData alloc] initWithContentsOfFile:[self configureAudioRecordFilePath:self.currentFileName]]; [newAudioData appendData:audioData]; [newAudioData appendData:tempAudioData]; PADebug(@"data length:%zd", [newAudioData length]); [newAudioData writeToFile:音頻路徑 atomically:YES]; }else { [tempAudioData writeToFile:[self configureAudioRecordFilePath:self.currentFileName] atomically:YES]; } [[NSFileManager defaultManager]removeItemAtPath:音頻路徑 error:nil]; }