如何阻止多个AVAudioPlayers在swift中播放?

时间:2014-11-29 04:42:16

标签: ios audio swift viewcontroller

我是swift的新手,而且我是Objective-C的新手。最近我开始使用一个音板应用程序,在3个不同的视图控制器上播放很多声音对于下一次更新的应用程序,我想让它同时播放多个声音,我通过为每个按钮创建一个单独的audioPlayer来实现这一点。因此,对于每个视图控制器,我将有9个AVAudioPlayers实例(每个按钮一个),当按下每个按钮时,它将播放其中一个EX:audioPlayer8将属于hitmarkerButton。我成功地做到了这一点,但现在我想让用户按下一个按钮来“重置”应用程序中的声音。因此,对于每个视图控制器,我已经创建了一个名为stopPlayingSounds的IBAction,它应该“重置”或停止播放来自所有视图控制器的所有声音。这是我第一次在这里提问,请告诉我是否还有其他问题。谢谢。

下面包含的每个示例都是每个视图控制器最多9个示例中的一个。 PS - 每个视图控制器都是一个页面。

“Sound Stopper”按钮:

    @IBAction func stopPlayingSounds(sender: AnyObject) {

    }

其中一个按钮的示例:

    @IBAction func hitmarkerButton(sender: AnyObject) {
    audioPlayer8 = AVAudioPlayer(contentsOfURL: hitmarkerSound, error: nil)
    audioPlayer8.prepareToPlay()
    audioPlayer8.play()
}

AVAudioPlayers声明之一的示例:

var audioPlayer8 = AVAudioPlayer()

最后,一个创造实际声音的例子:

    var hitmarkerSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("hitmarker", ofType: "mp3")!)

2 个答案:

答案 0 :(得分:3)

我认为您只需要在按钮按下方法之外的某处初始化变量,这样您就可以在方法结束后看到这些变量。我总是听到“方法中发生的事情会停留在方法中......”

例如,我将声明放在视图控制器的顶部,并将它们填入数组:

var myAudioPlayers = [AVAudioPlayer] //remember arrays start at 0 and go up to n-1
myAudioPlayers[0] = AVAudioPlayer(contentsOfURL: sound1, error: nil)
...
myAudioPlayers[8] = AVAudioPlayer(contentsOfURL: sound8, error: nil)

然后你有

@IBAction func hitmarkerButton(sender: AnyObject) {
    audioPlayer[7].prepareToPlay()
    audioPlayer[7].play()
}

您可以使用数组快速执行:

@IBAction func stopPlayingSounds(sender: AnyObject) {
    foreach (ap in myAudioPlayers)
    ap.stop()
}

答案 1 :(得分:2)

我几周来一直在努力解决这个问题(来自已加载的每个流的重叠音频)。我最终发现每个let语句都会创建一个AVPlayer的新实例,因此多线程操作系统会同时播放它们。我通过在类级别创建一个AVPlayer来解决我的问题:

var vidPlayer:AVPlayer = AVPlayer() 

然后每次只需将vidPlayer重新分配给新内容:

vidPlayer = AVPlayer(URL: url) //where url was defined previously

播放器使用新内容重新启动,并且仅使用最新的音频流。