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