web-dev-qa-db-fra.com

Ajoutez des contrôles personnalisés à AVPlayer dans swift

J'essaie de créer une vue de table de telle sorte que je puisse lire des vidéos. Je peux le faire en utilisant AVPlayer et layer.

Je veux ajouter un bouton de lecture et de pause personnalisé avec un curseur au bas d'une vue vidéo.

AVPlayerController est intégré à ces commandes.

Comment puis-je les implémenter dans AVPlayer. Je cherchais des exemples. Mais je n'en ai pas trouvé.

Existe-t-il des exemples GitHub ou des exemples de code que je peux suivre? Toute aide sera vraiment appréciée.

11
A.S

ici j'ajoute les points, vous devez personnaliser en fonction de vos besoins.

Étape 1

masquer initialement vos contrôles AVPlayer,

 YourAVPlayerViewController.showsPlaybackControls = false

Étape 2

créer la structure comme

enter image description here

une étiquette pour la durée actuelle, une étiquette pour la durée globale, un bouton UI pour mettre en pause et lire votre lecteur actuel et un UISlider pour rechercher la vidéo.

étape-3

fermez d'abord les étapes simples.

arrêtez d'abord et jouez le joueur en utilisant l'action du bouton, currentPlayer est votre nom AVPlayer.

@IBAction func handlePlayPauseButtonPressed(_ sender: UIButton) {
   //  sender.isSelected ?  currentPlayer.pause() :   currentPlayer.play()
    if sender.isSelected {
        currentPlayer.pause()
    }
    else {
        currentPlayer.play()
    }
}

deuxième définir la durée de la vidéo, comme

    let duration : CMTime = currentPlayer.currentItem!.asset.duration
    let seconds : Float64 = CMTimeGetSeconds(duration)

    lblOverallDuration.text = self.stringFromTimeInterval(interval: seconds)

troisième définir l'heure actuelle du joueur sur l'étiquette de durée actuelle

    let duration : CMTime = currentPlayer.currentTime()
    let seconds : Float64 = CMTimeGetSeconds(duration)

    lblcurrentText.text = self.stringFromTimeInterval(interval: seconds)

la méthode suivante est convertie de NSTimeinterval en HH: MM: SS

func stringFromTimeInterval(interval: TimeInterval) -> String {

    let interval = Int(interval)
    let seconds = interval % 60
    let minutes = (interval / 60) % 60
    let hours = (interval / 3600)
    return String(format: "%02d:%02d:%02d", hours, minutes, seconds)
}

enfin, nous allons pour le contrôle du curseur pour calculer le temps de recherche

_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderTouchBegin), for: .touchDown)
_playheadSlider.addTarget(self, action:    #selector(self.handlePlayheadSliderTouchEnd), for: .touchUpInside)
_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderTouchEnd), for: .touchUpOutside)
_playheadSlider.addTarget(self, action: #selector(self.handlePlayheadSliderValueChanged), for: .valueChanged)

nous allons passer à l'action, initialement lorsque le début du toucher est commencé, puis arrêtons le joueur

handlePlayheadSliderTouchBegin

@IBAction func handlePlayheadSliderTouchBegin(_ sender: UISlider) {
currentPlayer.pause()
}

définir l'étiquette de l'élément en cours pour calculer la sender.value * CMTimeGetSeconds(currentPlayer.currentItem.duration)

@IBAction func handlePlayheadSliderValueChanged(_ sender: UISlider) {

        let duration : CMTime = currentPlayer.currentItem!.asset.duration
     let seconds : Float64 = CMTimeGetSeconds(duration) * sender.value
 //   var newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(currentPlayer.currentItem.duration)
lblcurrentText.text = self.stringFromTimeInterval(interval: seconds)
   }

déplacer enfin le joueur en fonction de la recherche

 @IBAction func handlePlayheadSliderTouchEnd(_ sender: UISlider) {

  let duration : CMTime = currentPlayer.currentItem!.asset.duration
var newCurrentTime: TimeInterval = sender.value * CMTimeGetSeconds(duration)
var seekToTime: CMTime = CMTimeMakeWithSeconds(newCurrentTime, 600)
currentPlayer.seek(toTime: seekToTime)
}
36
Anbu.Karthik