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的主要内容,如果未能解决你的问题,请参考以下文章