此按钮在点击按钮时播放声音,但如果再次按下则取消之前的声音。我不希望发生这种情况我反复按下时希望相同的声音重叠。我相信它可能是因为我在互联网上使用了相同的AVAudioPlayer,但我是swift的新手,想知道每次方法运行时如何创建一个新的AVAudioPlayer,所以声音重叠。
func playSound(sound:String){
// Set the sound file name & extension
let soundPath = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource(sound, ofType: "mp3")!)
do {
//Preperation
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch _{
}
do {
try AVAudioSession.sharedInstance().setActive(true)
}
catch _ {
}
//Play the sound
var error:NSError?
do{
audioPlayer = try AVAudioPlayer(contentsOfURL: soundPath)
}catch let error1 as NSError {
error = error1
}
audioPlayer.prepareToPlay()
audioPlayer.play()
}
要与AVAudioPlayer同时播放两个声音,您只需为每个声音使用不同的播放器。
在我的例子中,我已经在Viewcontroller中声明了两个玩家playerBoom
和playerCrash
,我正在通过一个函数填充声音来播放,然后立即触发播放:
import AVFoundation
class ViewController: UIViewController {
var playerBoom:AVAudioPlayer?
var playerCrash:AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
playerBoom = preparePlayerForSound(named: "sound1")
playerCrash = preparePlayerForSound(named: "sound2")
playerBoom?.prepareToPlay()
playerCrash?.prepareToPlay()
playerBoom?.play()
playerCrash?.play()
}
func preparePlayerForSound(named sound: String) -> AVAudioPlayer? {
do {
if let soundPath = NSBundle.mainBundle().pathForResource(sound, ofType: "mp3") {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)
return try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: soundPath))
} else {
print("The file '\(sound).mp3' is not available")
}
} catch let error as NSError {
print(error)
}
return nil
}
}
它工作得很好,但如果您有很多声音可以播放IMO。不过,这对于少数人来说是完全有效的解决方案。
这个例子有两种不同的声音,但当然这个想法与两种不同的声音完全相同。
我只能使用AVAudioPlayer找不到解决方案。
相反,我已经找到了一个解决这个问题的解决方案,它建立在AVAudioPlayer之上。
该库允许相同的声音彼此重叠播放。