有声音停止并立即按下按钮

时间:2015-07-18 14:07:13

标签: ios swift audio

我正在制作一个有趣的应用程序来测试我的学习,而且我已经完成了大部分内容,但我对此解决方案提出了一些警告。

每次点击屏幕时,应用程序都应播放喇叭声。但这应该允许你连续快速连续按下它,并且每次都会播放喇叭声。它也应该停止前一个喇叭声音,因此没有重叠的声音。

这是我到目前为止所管理的内容

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

2 个答案:

答案 0 :(得分:1)

它比那简单得多!如果您希望音频在按下按钮后准确启动,则在将按钮连接到代码时,应将事件更改为“Touch Down”。而已!对于按钮这就足够了:

@IBAction func buttonPressed(sender: AnyObject) {

    horn.currentTime = 0
    horn.play()

}

答案 1 :(得分:0)

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