gpt4 book ai didi

ios - 带有 AVAudioPlayer 的 iOS 中的 Swift : Singleton not working the way I hoped it would

转载 作者:行者123 更新时间:2023-11-28 08:32:16 25 4
gpt4 key购买 nike

我正在使用标准的 Master-Detail 项目,在 Master 中列出歌曲并在 Detail 中播放它们。每首歌曲最多同时播放四个部分,具有独立的音量控制,因此我在 Detail 中有四个 AVAudioPlayer 对象,每个对象都有一个带有 IBOutlet 的 slider 和一个 IBAction 来实现音量控制。

问题是当你点击一首歌曲时(在 Master 的列表中),上一首歌曲不会停止。两首歌曲都会播放,但音量控制现在只能控制最近的歌曲。这可以适用于任意数量的歌曲。

我想在点击一首新歌时摆脱当前播放的歌曲。

我想我可以通过在 Singleton 中创建玩家来实现这一点,这样一来只有四个玩家。因为根据文档,每个播放器一次只能播放一个声音文件,所以我希望新的声音文件开始时,以前的声音文件会停止播放。但它不起作用。上面描述的相同行为仍在发生:多首歌曲可以同时播放,音量控制只控制最近的歌曲。任何建议将不胜感激。

这是单例的代码:

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 设为静态,但当这不起作用时,我决定也将每个单独的播放器设为静态。)

然后,在 DetailViewController 中:

var audioPlayers = FourPlayers.audioPlayers

这是四个音量控件之一的代码:

@IBOutlet weak var vol1: UISlider!

@IBAction func volAdjust1(sender: AnyObject) {
audioPlayers[0].volume = vol1.value
}

播放歌曲看起来像这样(当歌曲信息从 Master 传入时,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 not working the way I hoped it would,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com