AVAudioPlayer 即时更改声音 URL

Posted

技术标签:

【中文标题】AVAudioPlayer 即时更改声音 URL【英文标题】:AVAudioPlayer change sound URL on the fly 【发布时间】:2015-04-17 11:42:48 【问题描述】:

在我的 init 方法中,我像这样初始化 sound_a.wav。

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

根据场景,我需要播放不同的声音(假设声音是 sound_b)。

我需要什么代码来即时更改它?

【问题讨论】:

检查我的答案。 AVQueuePlayer可以帮到你 【参考方案1】:

首先如果AVAudioPlayer还在播放,请停止:

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

然后,使用新 URL 重新创建新的 AVAudioPlayer我重新启动播放器的第一个建议不起作用。您必须创建一个新实例。

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

更好的解决方案是将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];

【讨论】:

看起来 URL 是只读的 @property(readonly) NSURL url; / 如果对象不是使用 URL 创建的,则返回 nil */ [[NSBundle mainBundle] URLForResource:@"sound_b" withExtension:@"wav"] 呢? 这实际上是我要问的,我可以更新网址吗? 你不能更新 URL,只能用另一个 URL 实例化一个新的播放器。初始化需要一些时间,因此您不能使用此解决方案即时播放新声音。【参考方案2】:

不确定“场景”在这里是什么意思。但是,您可以通过创建一个包含声音列表的数组并每次生成一个随机索引来播放随机声音。

【讨论】:

【参考方案3】:

您可以为所有想要播放的声音创建 AVAudioPlayer 实例,并使用 prepareToPlay 预加载它们的缓冲区。然后,当您需要播放另一个声音时,只需使用 stop 方法停止前一个播放器并使用 playAtTime: 播放另一个播放器(用于下一个声音)。

【讨论】:

为什么我需要 playAtTime?播放声音就好了,不是吗? 这取决于您的需求。我建议你使用playWithTime:,因为这个播放器之前可以玩,并且会有不同的currentTime。在这种情况下,请致电 [player playWithTime:0] 从头开始​​播放。 [player playWithTime:0] 和[player play] 是一样的,对吗? [player play]player.currentTime 开始播放,[player playAtTime:0] 从开始播放

以上是关于AVAudioPlayer 即时更改声音 URL的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer Swift 3不播放声音[重复]

如何判断 AVAudioPlayer 播放完毕

AVAudioPlayer 多重声音嘈杂

声音 AVAudioPlayer 不工作

重用 AVAudioPlayer 以获得不同的声音

使用 AVAudioPlayer 没有声音