2011-04-16 31 views
4

这个问题在其他几个问题出在这里的SO AVAudioPlayer滞后:试图修复它最初使用

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但不播放,则单击第一个对象时会观察到音频延迟。但是,如果我在虚拟音频播放器上调用播放器,那么我不会在初始对象上获得延迟,但视图负载会延迟2秒。

有没有办法解决这个问题?我应该简单地创建一个负载的AVAudioPlayers的NSArray,并告诉他们所有准备播放,然后在点击对象时调用播放?

+2

我结束了创建一个NSArray含AVAudioPlayer对象都曾经有过prepareToPlay他们叫。这工作得很好,虽然我希望有人会提出一个更优雅的解决方案。 – slayton 2011-04-16 04:32:46

回答

4

有时它可以帮助让viewDidLoad通过使用peformSelector:withObject:afterDelay:这样的初始化来后退。例如:

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