#ios #swift #avplayer
#iOS #swift #avplayer
Вопрос:
Я использую AVPlayer для воспроизведения видео. Я должен загружать gif до загрузки первого кадра видео. Я использую SwiftyGif
для того же.
Я уже прочитал много сообщений stack. Я пробовал использовать различные методы с видеоплеером, такие как .readyToPlay
, .unknown
, но не смог получить доступ к загрузке первого кадра. Иногда он работает хорошо, но в других случаях загрузка не происходит или остается там, даже когда видео воспроизводится
func showLoadingGif() {
let gifManager = SwiftyGifManager(memoryLimit:50)
if UIDevice.current.userInterfaceIdiom == .pad {
let gif = UIImage(gifName: "loading.gif")
imgViewSplash = UIImageView(gifImage: gif, manager: gifManager)
}
else
{
let gif = UIImage(gifName: "loading_mobile.gif")
imgViewSplash = UIImageView(gifImage: gif, manager: gifManager)
}
imgViewSplash.loopCount = 10000
// imageview.delegate = self
imgViewSplash.frame = CGRect(x: 0.0, y: 0.0, width: self.view.bounds.size.width, height: self.view.bounds.size.height 100)
imgViewSplash.center = CGPoint(x: view.frame.size.width / 2, y: view.frame.size.height / 2)
if self.view.subviews.contains(imgViewSplash) {
self.imgViewSplash.removeFromSuperview() // Remove it
}
self.view.addSubview(imgViewSplash)
}
func hideLoadingGif() {
if self.view.subviews.contains(imgViewSplash) {
self.imgViewSplash.removeFromSuperview() // Remove it
}
}
self.observer = playerVideo.addPeriodicTimeObserver(forInterval: CMTimeMakeWithSeconds(1, 1), queue: DispatchQueue.main) { (CMTime) -> Void in
if self.playerVideo.currentItem?.status == .readyToPlay {
self.updateSlider(elapsedTime: CMTime)
if let currentItem = self.playerVideo.currentItem {
let duration = currentItem.asset.duration
print("Total Duration - (duration)")
self.hideLoadingGif()
}
let time : Float64 = CMTimeGetSeconds(self.playerVideo.currentTime());
//print("(time)")
print("App Into Overlay - (time)")
let playbackLikelyToKeepUp = self.playerVideo.currentItem?.isPlaybackLikelyToKeepUp
if playbackLikelyToKeepUp == false {
//print("Here start the activity indicator inorder to show buffering")
}else{
//print("stop the activity indicator")
}
}
if self.playerVideo.currentItem?.status == .unknown
{
self.btnPlay.isUserInteractionEnabled = true
self.progressMainView.isUserInteractionEnabled = true
self.hideLoadingGif()
}
}
Ожидаемые результаты должны быть такими: gif должен появляться во время загрузки видео, и когда загружается первый кадр ОС, он должен скрываться, и видео должно воспроизводиться, но на самом деле gif приходит, и иногда он скрывается до загрузки первого кадра, а в других случаях он остается там, и видео начинает воспроизводиться.