如何播放与AVAudioPlayer重叠的声音?

问题描述 投票:2回答:2

此按钮在点击按钮时播放声音,但如果再次按下则取消之前的声音。我不希望发生这种情况我反复按下时希望相同的声音重叠。我相信它可能是因为我在互联网上使用了相同的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()

}
swift audio avaudioplayer overlap
2个回答
1
投票

要与AVAudioPlayer同时播放两个声音,您只需为每个声音使用不同的播放器。

在我的例子中,我已经在Viewcontroller中声明了两个玩家playerBoomplayerCrash,我正在通过一个函数填充声音来播放,然后立即触发播放:

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。不过,这对于少数人来说是完全有效的解决方案。

这个例子有两种不同的声音,但当然这个想法与两种不同的声音完全相同。


0
投票

我只能使用AVAudioPlayer找不到解决方案。

相反,我已经找到了一个解决这个问题的解决方案,它建立在AVAudioPlayer之上。

该库允许相同的声音彼此重叠播放。

https://github.com/adamcichy/SwiftySound

© www.soinside.com 2019 - 2024. All rights reserved.