2015-04-17 84 views
3

在我的init方法中,我初始化sound_a.wav。AVAudioPlayer動態地更改聲音網址

AVAudioPlayer *snd = [[AVAudioPlayer alloc] initWithContentsOfURL:[[NSBundle mainBundle] 
    URLForResource:@"sound_a" withExtension:@"wav"] error: nil]; 

根據情景我需要播放不同的聲音(讓我們假設聲音是sound_b)。

我需要什麼代碼才能在飛行中更改此代碼?

+0

檢查我的答案。 'AVQueuePlayer'可以幫助你 – dit

回答

0

不確定在這裏「場景」是什麼意思。但是,您可以通過創建一個包含聲音列表的數組並隨機生成一個隨機索引來播放隨機聲音。

3

首先,如果AVAudioPlayer還在玩,阻止它:

if([snd isPlaying]){ 
    [snd stop]; 
} 

然後,重新創建新的AVAudioPlayer新的網址。 我的第一個建議重新啓動播放器將不起作用。你必須創建一個新的實例。

更好的解決方法是使用AVQueuePlayer多個聲音:

AVPlayerItem *item1 = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"sound_a"]]; 
AVPlayerItem *item2 = [AVPlayerItem playerItemWithURL:[NSURL URLWithString:@"sound_b"]]; 
AVQueuePlayer *player = [[AVQueuePlayer alloc] initWithItems:@[item1, item2]]; 

[player play]; 

[...] 

[player advanceToNextItem]; 
+0

看起來URL是隻讀的@property(只讀)NSURL * url;/*返回nil如果對象不是用URL創建的*/ – cateof

+0

'[[NSBundle mainBundle] URLForResource:@「sound_b」withExtension:@「wav」]'? – dit

+0

這就是我所要求的,我可以更新URL嗎? – cateof

0

您可以創建AVAudioPlayer的情況下爲所有聲音要播放和使用prepareToPlay預加載的緩衝區。然後,當您需要播放另一個聲音時,請使用stop方法停止上一個播放器,然後使用playAtTime:播放另一個播放器(用於下一個聲音)。

+0

爲什麼我需要playAtTime?播放聲音很好,不是嗎? – cateof

+0

這取決於你的需求。我建議你使用'playWithTime:',因爲這個播放器可以先播放,並且會有不同的'currentTime'。在這種情況下,請調用'[player playWithTime:0]'從一開始播放。 –

+0

[player playWithTime:0]與[player play]相同,對嗎? – cateof