使用GCD to load audio data
. 使用 GCD 将歌曲的数据异步加载到 NSData 的实例中,并将其用作音频播放器的馈送。您必须这样做,因为加载音频文件的数据(取决于音频文件的长度)可能需要很长时间,如果您在主线程上执行此操作,那么您将面临暂停 UI 体验的风险. 因此,您必须使用全局并发队列来确保您的代码不会在主线程上运行。如果它在主线程上,那么您面临的问题就会发生。看到这个示例代码
dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(dispatchQueue, ^(void)
{
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"MySong" ofType:@"mp3"];
NSData *fileData = [NSData dataWithContentsOfFile:filePath]; NSError *audioPlayerError = nil;
self.audioPlayer = [[AVAudioPlayer alloc] initWithData:fileData error:&audioPlayerError];
if (self.audioPlayer != nil)
{
self.audioPlayer.delegate = self;
if ([self.audioPlayer prepareToPlay] && [self.audioPlayer play])
{
NSLog(@"Successfully started playing.");
}
else
{
NSLog(@"Failed to play the audio file.");
self.audioPlayer = nil;
}
}
else { NSLog(@"Could not instantiate the audio player.");
} });
您的问题也可能是因为initWithContentsOfURL
,如果它没有通过该 URL 获取数据,那么它不会播放音频。
您的代码的其他问题可能是释放 audioPlayer 对象。如果您分配了很多对象并且从不从内存中释放它们。这最终可能导致内存不足。