如何播放与 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 中声明了两个播放器,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 不适合。不过,对于少数人来说,这是一个完全有效的解决方案。
这个例子有两个不同的声音,但当然两个相同的声音的想法是完全相同的。
【讨论】:
您的回答很好,可以更深入地了解问题,但是如果我不知道代码中需要多少音频播放器,该怎么办。有没有办法声明更多“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 重叠的相同声音?的主要内容,如果未能解决你的问题,请参考以下文章