2011-04-16 29 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]; 
}