0
votes

Comment détecter quelle vidéo s'est terminée lors de l'utilisation de plusieurs Avplayers?

Je joue deux vidéos côte à côte à l'écran, donc j'ai deux instances d'Avplayer. Je détecte la fin de la lecture vidéo en utilisant une notification qui fonctionne bien. Mon sélecteur (playerdidfinishPlaying) est appelé pour les deux vidéos quand ils se terminent.

NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlaying), name: .AVPlayerItemDidPlayToEndTime, object: nil) 


1 commentaires

Mon sélecteur est appelé parfaitement bien pour les deux vidéos quand ils se terminent. Je veux identifier de manière unique l'Avplayer pour lequel il a été appelé.


3 Réponses :


4
votes

via l'objet de notification d'identification de manière unique,

Notification de poste .avplayeritemDidPlayToendTime code> avec objet de lecteur.CurrentItem code> p> xxx pré >


le moyen facile: p>

Le code suivant fonctionne, l'inconvénient est que lorsque un joueur se termine, la méthode de notification sera appelée deux fois. P>

var player = AVPlayer()
var playerTwo = AVPlayer()

var hasPlay: (one: Bool, two: Bool) = (false, false)


override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlay), name: .AVPlayerItemDidPlayToEndTime, object: nil)
    }

    @IBAction func beepPressed(_ sender: UIButton) {
        hasPlay.one = true
        let url = // ...
        player = AVPlayer(url: url!)
        player.play()

    }


    @IBAction func beepPressedTwo(_ sender: UIButton) {
       hasPlay.two = true

       let url = // ...
       playerTwo = AVPlayer(url: url!)
       playerTwo.play()

    }

    @objc func playerDidFinishPlay() {

        if player.isPlaying == false, hasPlay.one == true{
            hasPlay.one = false
            print("1")
        }

        if playerTwo.isPlaying == false, hasPlay.two == true{
            hasPlay.two = false
            print("2")
        }


    }

}




extension AVPlayer {
    var isPlaying: Bool {
        return rate != 0 && error == nil
    }
}


1 commentaires

J'ai deux joueurs. Alors quel objet devrais-je passer? Player1.CurrentItem ou Player2.CurrentItem?



1
votes

Mise à jour @ Dengst30's Méthode de Dengst30, avec une certaine facilité.

Avec deux notifications enregistrées, une méthode de fin sera appelée deux fois.

afin qu'il a donc besoin d'ajouter une certaine exclusive mutuellement exclusive. < Pré> xxx


0 commentaires

4
votes

Une autre idée. Mise à jour @ Black_pearl's Methode

Différente enregistrement de notification, avec différentes méthodes de notification. P>

    var player = AVPlayer()
    var playerTwo = AVPlayer()



    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishPlay(_:)), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem)
        NotificationCenter.default.addObserver(self, selector: #selector(playerDidFinishMusic(_:)), name: .AVPlayerItemDidPlayToEndTime, object: playerTwo.currentItem)

    }


       @objc func playerDidFinishPlay(_ noti: Notification) {
           if let p = noti.object as? AVPlayerItem, p == player.currentItem {
                print("1")
           }
       }


    @objc func playerDidFinishMusic(_ noti: Notification) {
        if let p = noti.object as? AVPlayerItem, p == playerTwo.currentItem{
            print("2")
        }
    }


0 commentaires