2017-02-22 6 views
0

У меня есть экран с 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) 
     } 
    } 

ответ

0
var queue = AVQueuePlayer() 
var items = [AVPlayerItem]() 
var currentlyPlaying = 0 
var isPlaying = false { 
    didSet{ 
     checkButtons() 
    } 
} 

@IBOutlet weak var button1 : UIButton? //connect to button 1 
@IBOutlet weak var button2 : UIButton? //connect to button 2 
@IBOutlet weak var button3 : UIButton? //connect to button 3 

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) { 
    self.currentlyPlaying = 1 
    self.isPlaying = true 
    sender.isSelected = true 
    queue.play() 
} 

@IBAction func pushButton2(sender: UIButton) { 
    self.currentlyPlaying = 2 
    self.isPlaying = true 
    if self.lonelyPlayer == nil { 

    }else { 
     if (self.lonelyPlayer?.isPlaying)! { 
      self.lonelyPlayer?.stop() 
     } 
    } 
    audioPlayer(url: url1, buttonId: 1)  
} 

@IBAction func pushButton3(sender: UIButton) { 
    self.currentlyPlaying = 3 
    self.isPlaying = true 
    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 
    } 
    self.isPlaying = 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 
    } 
    self.isPlaying = false 
) 

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) 
    } 
} 

func checkButtons() { 
    if isPlaying { 
     switch currentlyPlaying { 
     case 1: 
      button2.isEnabled = false 
      button3.isEnabled = false 
     case 2: 
      button1.isEnabled = false 
      button3.isEnabled = false 
     case 3: 
      button1.isEnabled = false 
      button2.isEnabled = false 
     default: 
      print("Something went wrong!") 
     } 
    } else { 
     button1.isEnabled = true 
     button2.isEnabled = true 
     button3.isEnabled = true 
    } 
} 

Он блокирует кнопки, когда он играет.

Примечание: этот код не был проверен, как я писал это на автобусе

EDIT: Вы можете установить queue в качестве опции, а затем использовать queue.pause и затем queue = nil, чтобы остановить его. Не забудьте перераспределить его, прежде чем использовать его снова!

+0

Я получаю много ошибок в аудиоплеере и функции checkButton's:/ – rebecca87

+0

Какие ошибки? Вы можете сделать снимок экрана? – paper1111

+0

ummm Я снова внедрил ваш код. Он не получает ошибок, но кнопка 2 3 4 не воспроизводит музыку. – rebecca87

Смежные вопросы