我正在使用一个标准的主细节项目,在主目录中列出歌曲并详细播放它们。每首歌最多有四个部分同时播放,有独立的音量控制,所以我有四个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/

10-14 23:22
查看更多