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

Posted

技术标签:

【中文标题】如何播放与 AVAudioPlayer 重叠的相同声音?【英文标题】:How to play the same sound overlapping with AVAudioPlayer? 【发布时间】:2016-01-13 10:19:00 【问题描述】:

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


【问题讨论】:

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

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

【讨论】:

您的回答很好,可以更深入地了解问题,但是如果我不知道代码中需要多少音频播放器,该怎么办。有没有办法声明更多“var playerBoom:AVAudioPlayer”?通过循环方法? AVAudioPlayer 也是快速播放声音的唯一方法吗? 如果你不知道声音的数量(顺便说一句,这与你的问题不同,即“播放 same 声音重叠”)那么你应该' t 使用 AVAudioPlayer 来解决您的问题。因为您必须为每个声音声明一个播放器和变量,所以如果您想要重叠,则别无选择:AVAudioPlayer 一次只能播放一种声音。好吧,您可以创建一个 array 的 AVAudioPlayers 准备好声音,并将该数组保存在一个变量中,但我不推荐这种解决方案,它很快就会变得混乱。恐怕您将不得不寻找 AVAudioPlayer 以外的其他方法。 我的意思是它是一种声音,但谁知道它可以播放多少次相对于声音文件的长度和按下的次数。 (可能是 10 个或 100 个重叠的相同声音)你有没有用过另一种方式来播放声音?无论如何,谢谢您的回答,它及时而彻底 谢谢。好吧,如果只有一种声音,我的回答适用。只需为两个 AVAudioPlayer 提供相同的声音,然后根据需要交替播放它们。但这并不理想,因为不精确,我不推荐它。看看 SpriteKit 声音方法,我想它会更适合您的需求。 使用交替方法你知道如何创建一个 AVAudioPlayers 数组,因为我可能会使用很多音频播放器。【参考方案2】:

我找不到仅使用 AVAudioPlayer 的解决方案。

相反,我找到了一个解决这个问题的方法,它使用了一个构建在 AVAudioPlayer 之上的库。

库允许相同的声音相互重叠播放。

https://github.com/adamcichy/SwiftySound

【讨论】:

以上是关于如何播放与 AVAudioPlayer 重叠的相同声音?的主要内容,如果未能解决你的问题,请参考以下文章

相同的声音重叠使其非常响亮。提示与技巧?

iPhone:AVAudioPlayer 并不总是在设备上播放音频

Iphone:在播放一首歌曲时,另一首歌曲重叠。

AVAudioPlayer 多重声音嘈杂

AvAudioPlayer 不工作?

AVAudioPlayer 中断后从相同状态恢复音频剪辑