我是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")!)
答案 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
播放器使用新内容重新启动,并且仅使用最新的音频流。