AVAudioPlayer停止声音并从开头播放

28

我使用 AVAudioPlayer 播放了一个10秒的wav文件,它可以正常工作。 现在我想在第4秒停止wav文件的播放,然后再从第1秒重新播放。

这是我尝试过的代码:

NSString *ahhhPath = [[NSBundle mainBundle] pathForResource:@"Ahhh" ofType:@"wav"];
AVAudioPlayer *ahhhhhSound =[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:ahhhPath] error:NULL];

[ahhhhhSound stop];
[ahhhhhSound play];

我的问题是,wav文件在播放到第4秒时停止,但当我再次运行 [XXX 播放] 指令后,wav从第5秒继续播放而不是重新开始播放。

请问有什么方法可以解决这个问题吗?非常感谢您的帮助。


对于短促的声音,表现出来的症状是声音第二次不播放-调用停止和播放只会导致声音完成播放,并且听起来好像第二次播放被忽略了。这就是我的代码中发生的情况,下面的答案解决了这个问题。 - Echelon
3个回答

63

苹果的AVAudioPlayer类参考文档中提到:

stop方法不会将currentTime属性的值重置为0。换句话说,如果你在播放期间调用stop,然后调用play,播放将从离开时的位置恢复。

因此,您应该能够使用以下方法重新启动它:

[ahhhhhSound stop];
ahhhhhSound.currentTime = 0;
[ahhhhhSound play];

我发现在iOS 4.3.3和4.3.5设备上存在问题。但在iOS 5.0.1设备上能够正常工作。(iPhone 4和4S) 经过停止,将currentTime设置为0,然后播放,实际上播放失败了(返回NO)。我都快抓狂了... - Jonny
@Jonny:那就提出一个新问题吧。这个问题已经1.5年了;-) - DarkDust
不,我找到了一个解决方法,正在为你的声誉而奔跑。;-) - Jonny
1
不要调用stop(),而是调用pause(),因为stop()会卸载并删除音频播放器的硬件设置,而pause()只会暂停声音,但保持硬件设置准备好进行播放=更快=更少延迟。 - StackUnderflow

6

正如你在DarkDust的回答中所看到的,我遇到了一些问题。这个问题只出现在iOS 4.3.3/4.3.5的iPhone 4上。可能早期的iOS版本也有这个问题,但是在iOS 5.0.1上没有。一些AVAudioPlayer似乎会在停止时“崩溃”,后续的播放会变得无法预测。实际上,“停止”会卸载一些在prepareToPlay中加载的东西,如果你只是“暂停”播放器,则不会卸载这些内容-根据参考文献。所以,我的解决方案是使用暂停而不是停止-前提是播放器正在播放-否则就没有停止任何东西的理由。从理论上讲,这应该更快。这对我来说解决了问题。

if (ahhhhhSound.playing) {
    [ahhhhhSound pause];
}
ahhhhhSound.currentTime = 0;
[ahhhhhSound play];

现在,我可以继续我的生活了。

对于我的问题(声音会中断,其他声音只播放结束部分等等...我有多个AVAudioPlayer实例),使用暂停并将currentTime设置为0解决了所有问题!给这个解决方案点个赞。 - James Brooks

0

Swift:

mySound.audioPlayer?.stop()
mySound.audioPlayer?.currentTime = 0
mySound.audioPlayer?.play()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接