尝试修复 AVAudioPlayer 在其初始使用时的滞后
Posted
技术标签:
【中文标题】尝试修复 AVAudioPlayer 在其初始使用时的滞后【英文标题】:Trying to fix AVAudioPlayer lag on its initial use 【发布时间】:2011-04-16 04:01:35 【问题描述】:此问题已出现在 SO 上的其他几个问题中:
Slow start for AVAudioPlayer the first time a sound is played
Delay in playing sounds using AVAudioPlayer
我已尝试实施建议的修复,但没有一个解决我的问题。我的应用程序向用户展示了要触摸的对象网格,当触摸对象时会播放声音。这很好用,只是在初次触摸时会有约 2 秒的延迟。
为了解决这个问题,我用一个虚拟的 aiff 文件初始化我的音频播放器:
- (void)viewDidLoad
NSString *soundFile = [Card loadCardSoundPath:@"dummy"];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
[NSURL fileURLWithPath:soundFile] error:nil];
self.audioPlayer = player;
[audioPlayer setDelegate:self];
[audioPlayer prepareToPlay];
// [audioPlayer play];
[player release];
...
[super viewDidLoad];
然后当一个物体被触摸时,我会调用:
NSString *soundFile = [Card loadCardSoundPath:name];
if (soundFile != nil)
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
[NSURL fileURLWithPath:soundFile] error:nil];
self.audioPlayer = player;
[self.audioPlayer setDelegate:self];
[self.audioPlayer prepareToPlay];
[self.audioPlayer play];
[player release];
我观察到的行为是这样的:如果我创建一个虚拟音频播放器并调用 prepareToPlay 但不播放,我会在单击第一个对象时观察到音频延迟。但是,如果我在虚拟音频播放器上调用 play,那么我不会得到初始对象的延迟,但视图加载会延迟 2 秒。
有没有办法解决这个问题?我是否应该在加载时简单地创建一个 AVAudioPlayers 的 NSArray 并告诉他们准备播放,然后在单击对象时调用 play?
【问题讨论】:
我最终创建了一个包含 AVAudioPlayer 对象的 NSArray,这些对象都调用了 prepareToPlay。这工作得很好,虽然我希望有人会提出一个更优雅的解决方案。 【参考方案1】:有时,通过使用peformSelector:withObject:afterDelay:
假脱机初始化,让viewDidLoad
返回会有所帮助。例如:
- (void)viewDidLoad
// initialization ...
[super viewDidLoad];
[self performSelector:@selector(primeAudioPlayer) withObject:nil afterDelay:0.1];
-(void)primeAudioPlayer
NSString *soundFile = [Card loadCardSoundPath:@"dummy"];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:
[NSURL fileURLWithPath:soundFile] error:nil];
[audioPlayer prepareToPlay];
[player release];
【讨论】:
以上是关于尝试修复 AVAudioPlayer 在其初始使用时的滞后的主要内容,如果未能解决你的问题,请参考以下文章
AVAudioPlayer 在使用 M4A 文件初始化时抛出。 (OSStatus 错误 2003334207。)