【问题标题】:AVAudioPlayer stop a sound and play it from the beginningAVAudioPlayer 停止声音并从头开始播放
【发布时间】:2011-04-20 05:48:48
【问题描述】:

我用 AVAudioPlayer 播放了一个 10 秒的 wav 文件,效果很好。 现在我要在第 4 秒停止 wav 然后从 非常第一秒。

这是我试过的代码:

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 play] 时,wav 继续播放第 5 秒,而不是从头开始播放。

我怎样才能做到这一点?任何帮助将不胜感激。

【问题讨论】:

  • 对于简短的声音,明显的症状是声音没有播放第二次 - 调用停止和播放只是导致声音完成播放,听起来第二次播放被忽略了。这就是我的代码中发生的事情,下面的答案修复了它。

标签: cocoa-touch avaudioplayer avfoundation


【解决方案1】:

Apple 的 AVAudioPlayer class reference 说:

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:然后问一个新问题。这个问题是 1.5 岁;-)
  • 不,我找到了一个解决方法,我正在为你的名声而奔波;-)
  • 不要调用 stop() 而是调用 pause(),因为 stop() 将卸载并删除音频播放器的硬件设置,而 pause() 只会暂停声音但保留硬件准备好播放 = 更快 = 更少延迟。
【解决方案2】:

所以从我对 DarkDust 答案的评论中可以看出,我遇到了一些麻烦。该问题仅出现在 iOS 4.3.3/4.3.5、iPhone 4 上。可能还有早期的 iO​​S 版本,但不是 iOS 5.0.1。不知何故, AVAudioPlayer 本身在停止时似乎“中断”,而后者的播放将莫名其妙地失败。实际上,“停止”会卸载prepareToPlay上加载的一些内容,如果您只是“暂停”播放器,则不会卸载这些内容 - 根据参考资料。所以我的解决方案是使用暂停而不是停止 - 考虑到播放器当前正在播放 - 否则没有理由停止任何事情。理论上也应该更快。帮我解决了。

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

现在我可以重新开始生活了。

【讨论】:

  • +1 对此解决方案。我遇到了停止问题(声音会中断,只有结尾部分会播放其他声音,等等......我有多个 AVAudioPlayer 实例)。使用暂停并将 currentTime 设置为 0 可以解决我的所有问题!
【解决方案3】:

斯威夫特:

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

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多