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)
3 Réponses :
via l'objet de notification d'identification de manière unique,
Notification de poste 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> .avplayeritemDidPlayToendTime code> avec objet de
lecteur.CurrentItem code> 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
}
}
J'ai deux joueurs. Alors quel objet devrais-je passer? Player1.CurrentItem ou Player2.CurrentItem?
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. p>
afin qu'il a donc besoin d'ajouter une certaine exclusive mutuellement exclusive. P> < Pré> xxx pré> p>
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") } }
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é.