按下按钮后立即停止并启动声音

Posted

技术标签:

【中文标题】按下按钮后立即停止并启动声音【英文标题】:Have a sound stop and start immediately on button press 【发布时间】:2015-07-18 14:07:13 【问题描述】:

我正在制作一个有趣的小应用程序来测试我的学习情况,并且我已经掌握了大部分内容,但我提出的解决方案有一点需要注意。

每次点击屏幕时,应用程序都会播放喇叭声。但这应该允许您连续快速连续按下它,并且每次都会播放喇叭声。它还应该停止之前的喇叭声,这样就不会有重叠的声音。

这是我到目前为止所做的事情

import UIKit
import AVFoundation

class ViewController: UIViewController 

    var horn:AVAudioPlayer = AVAudioPlayer()

    override func viewDidLoad() 
        super.viewDidLoad()
        prepareAudios()
    
    @IBAction func buttonPressed(sender: AnyObject) 
        horn.stop()
        horn.currentTime = 0
        horn.play()
    

    func prepareAudios() 
        var path = NSBundle.mainBundle().pathForResource("horn", ofType: "mp3")
        horn = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), error: nil)
        horn.prepareToPlay()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


它确实有效。它会停止声音并将其设置回开头,但是如果您单击得非常快,它会跳过并且有时不会播放。我想尝试解决这个问题,但我在谷歌上找不到太多。有没有更好的解决方案可以让我快速播放这种声音?

更新

根据 Duncan 的回答,我尝试创建两个声音实例来播放并在它们之间切换,但我似乎无法让它们在每次触摸屏幕时正确启动声音快速继承。这是我尝试过的代码

class ViewController: UIViewController 

    var horn1:AVAudioPlayer = AVAudioPlayer()
    var horn2:AVAudioPlayer = AVAudioPlayer()

    override func viewDidLoad() 
        super.viewDidLoad()
        prepareAudios()
    
    var bool = true
    @IBAction func butonPressed(sender: AnyObject) 
        if(bool)
            horn1.play()
            horn2.stop()
            horn2.currentTime = 0
            bool = false
        else
            horn2.play()
            horn1.stop()
            horn1.currentTime = 0
            bool = true
        
    

    func prepareAudios() 
        var path = NSBundle.mainBundle().pathForResource("horn", ofType: "mp3")
        horn1 = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), error: nil)
        horn2 = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), error: nil)
        horn1.prepareToPlay()
        horn2.prepareToPlay()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


每次按下按钮时,声音播放前都会稍有延迟。我希望声音立即重新开始。我希望喇叭能够像此视频中一样发出声音

https://www.youtube.com/watch?v=Ks5bzvT-D6I

【问题讨论】:

【参考方案1】:

比这简单得多!如果您希望音频在按钮被按下后准确开始,您应该在将按钮连接到代码时将事件更改为“Touch Down”。就是这样!对于按钮来说这就足够了:

@IBAction func buttonPressed(sender: AnyObject) 

    horn.currentTime = 0
    horn.play()


【讨论】:

【参考方案2】:

尝试创建 2 个喇叭播放器实例,并每次调用 prepareToPlay。然后,当您单击按钮时,停止正在播放的按钮,启动新按钮,然后在您停止的按钮上调用 prepareToPlay 以使其准备就绪。您需要构建一些程序逻辑来实现它。

【讨论】:

以上是关于按下按钮后立即停止并启动声音的主要内容,如果未能解决你的问题,请参考以下文章

如何在按下按钮时播放音频并在我的手指离开同一个按钮时立即停止?

当用户按下主页按钮时停止声音

如何通过按下按钮返回或按钮主页停止播放声音

同时播放两个声音c#

如何停止 AudioToolbox 声音?

LocalPushNotification 声音和 iPhone 的音量按钮