У меня есть экран с 3 различными кнопками. Когда Button1 используется, вызывается AVQueuePlayer. Когда вызывается Button2 или Button3, вызывается AVAudioPlayer.AVQueuePlayer и AVAudioPlayer вызываются одновременно
Проблема возникает при нажатии кнопки Button1 (инициирование AVQueuePlayer), а затем нажата кнопка Button2 или Button3 (инициирование AVAudioPlayer). В результате звуковой файл, воспроизводимый в настоящее время проигрывателем AVQueuePlayer, и аудиофайл, воспроизводимый в AVAudioPlayer, воспроизводятся одновременно.
Я ищу способ предотвратить включение Button2 или Button3 во время работы AVQueuePlayer или, если AVQueuePlayer перестает играть, если пользователь нажимает кнопку Button2 или Button3.
Я обнаружил, что вместо использования двух игроков использование только одного игрока решит проблему, но я не знаю, как это сделать.
var queue = AVQueuePlayer()
var items = [AVPlayerItem]()
override func viewDidLoad() {
super.viewDidLoad()
let asset1 = AVPlayerItem(url: url1)
let asset2 = AVPlayerItem(url: url2)
let asset3 = AVPlayerItem(url: url3)
items = [asset1, asset2, asset3, asset4]
queue = AVQueuePlayer(items: items)
for item in queue.items() {
NotificationCenter.default.addObserver(self, selector:#selector(playerItemDidReachEnd(notification:)),
name: .AVPlayerItemDidPlayToEndTime, object: item)
}
}
@IBAction func pushButton1(_ sender: UIButton) {
sender.isSelected = true
queue.play()
}
@IBAction func pushButton2(sender: UIButton) {
if self.lonelyPlayer == nil {
}else {
if (self.lonelyPlayer?.isPlaying)! {
self.lonelyPlayer?.stop()
}
}
audioPlayer(url: url1, buttonId: 1) }
@IBAction func pushButton3(sender: UIButton) {
if self.lonelyPlayer == nil {
}else {
if (self.lonelyPlayer?.isPlaying)! {
self.lonelyPlayer?.stop()
}
}
audioPlayer(url: url2, buttonId: 2)
}
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
if (self.currentPlayer == 1) {
yourButton2.isSelected = false
} else if (self.currentPlayer == 2) {
yourButton3.isSelected = false
}
}
func playerItemDidReachEnd(notification: NSNotification) {
if notification.object as? AVPlayerItem == items[0] {
yourButton1.isSelected = false
yourButton2.isSelected = true
}
if notification.object as? AVPlayerItem == items[1] {
yourButton2.isSelected = false
yourButton3.isSelected = true
}
func audioPlayer(url: URL, buttonId: Int) {
do {
try lonelyPlayer = AVAudioPlayer(contentsOf:url)
lonelyPlayer!.play()
lonelyPlayer!.delegate = self
yourButton2.isSelected = (buttonId == 1)
yourButton3.isSelected = (buttonId == 2)
currentPlayer = buttonId
} catch {
print(error)
}
}
Я получаю много ошибок в аудиоплеере и функции checkButton's:/ – rebecca87
Какие ошибки? Вы можете сделать снимок экрана? – paper1111
ummm Я снова внедрил ваш код. Он не получает ошибок, но кнопка 2 3 4 не воспроизводит музыку. – rebecca87