我正在制作一个有趣的应用程序来测试我的学习,而且我已经完成了大部分内容,但我对此解决方案提出了一些警告。
每次点击屏幕时,应用程序都应播放喇叭声。但这应该允许你连续快速连续按下它,并且每次都会播放喇叭声。它也应该停止前一个喇叭声音,因此没有重叠的声音。
这是我到目前为止所管理的内容
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.
}
}
每按一下按钮,声音播放前会有一点延迟。我希望声音立刻重新开始。我希望喇叭能听起来像在这个视频中
答案 0 :(得分:1)
它比那简单得多!如果您希望音频在按下按钮后准确启动,则在将按钮连接到代码时,应将事件更改为“Touch Down”。而已!对于按钮这就足够了:
@IBAction func buttonPressed(sender: AnyObject) {
horn.currentTime = 0
horn.play()
}
答案 1 :(得分:0)
尝试创建2个号角播放器实例,并每次调用prepareToPlay。然后当您单击按钮时,停止正在播放的按钮,启动新按钮,并在您停止的按钮上调用prepareToPlay以使其准备就绪。您需要构建一些程序逻辑来实现它。