我正在使用一个标准的主细节项目,在主目录中列出歌曲并详细播放它们。每首歌最多有四个部分同时播放,有独立的音量控制,所以我有四个AVAudioPlayer对象,每个对象都有一个带IBOutlet的滑块和一个IBAction来实现音量控制。
问题是,当你点击一首歌(在主菜单的列表中)时,前一首歌不会停止。两首歌都会播放,不过音量控制现在只控制最近的一首歌。这可以进行任何数量的歌曲。
我想摆脱当前播放的歌曲时,一首新的歌曲被点击。
我想我可以通过在一个单打内创建球员来实现这一点,这样就只有四个球员了。因为根据文档,每个播放器一次只能播放一个声音文件,所以我希望在新的声音文件启动时,以前的声音文件会停止播放。但没用。上面描述的相同行为仍在发生:多首歌曲可以同时播放,而音量控件仅控制最近的歌曲。如有任何建议,将不胜感激。
以下是单例的代码:
import Foundation
import AVFoundation
class FourPlayers {
static let audioPlayers = [one, two, three, four]
static let one = AVAudioPlayer()
static let two = AVAudioPlayer()
static let three = AVAudioPlayer()
static let four = AVAudioPlayer()
private init() {} //This prevents others from using the default '()' initializer for this class.
}
(最初,我只是将
audioPlayers
设为静态,但当这不起作用时,我决定将每个单独的玩家也设为静态。)然后,在详细视图控制器中:
var audioPlayers = FourPlayers.audioPlayers
以下是四种音量控制之一的代码:
@IBOutlet weak var vol1: UISlider!
@IBAction func volAdjust1(sender: AnyObject) {
audioPlayers[0].volume = vol1.value
}
播放歌曲如下所示(当从主控形状传入歌曲信息时,将填充audioFiles数组):
var audioFiles = []
func playAudioFiles() {
var i = 0
for _ in audioFiles {
audioPlayers[i].play()
i+=1
}
}
这是告诉玩家要播放哪个文件的代码:
func prepareAudioFiles () {
var i = 0;
for audioFile in audioFiles {
let s = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(audioFile as? String, ofType: "mp3")!)
do {
audioPlayers[i] = try AVAudioPlayer(contentsOfURL:s)
} catch {
print("Error getting the audio file")
}
audioPlayers[i].prepareToPlay()
self.audioPlayers[i].delegate = self
}
}
最佳答案
似乎音量控制只在调整第一个播放器(索引0)
@IBAction func volAdjust1(sender: AnyObject) {
audioPlayers[0].volume = vol1.value
}
也许您可以添加一个变量来跟踪当前正在播放的索引
var currentlyPlayingIndex = 0
@IBAction func volAdjust1(sender: AnyObject) {
audioPlayers[currentlyPlayingIndex].volume = vol1.value
}
必要时更新
播放音频时,可以使用相同的变量
func playAudioFiles() {
var i = 0
for _ in audioFiles {
if i == currentlyPlayingIndex {
audioPlayers[i].play()
} else {
audioPlayers[i].stop()
}
i+=1
}
}
关于ios - 使用AVAudioPlayer在iOS中使用Swift:Singleton无法按照我希望的方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38641987/