avplayer с медленным интернет-соединением не работает после первого кадра - PullRequest
0 голосов
/ 25 июня 2018

моя проблема в том, что при очень плохом соединении индикатор активности начинает анимироваться до тех пор, пока не отображается первый кадр в видео, а затем исчезает, думая, что видео воспроизводится, но видео перестает воспроизводиться, застряв на загруженном первом кадре, до полного видео загружается, затем возобновляется воспроизведение, как показать индикатор активности, пока видео застряло в кадре и буферизируется, затем воспроизвести до следующего загруженного кадра?

  • Примечания:

    • работает, когда интернет-соединение отключено, видео воспроизводится до тех пор, пока не отобразится загруженный кадр и индикатор активности, а затем при включении видео возобновится воспроизведение, а индикатор активности скрыт

    • работает при нормальном интернет-соединении

    • удаление и отображение индикатора с использованием значения переопределения для ключевого пути "CurrentItem.loadedTimeRanges" / "currentItem.playbackBufferEmpty"

я создал класс uiview с avplayer

import UIKit

import AVKit
import AVFoundation
class videoplaying: UIView {
    override static var layerClass: AnyClass {
        return AVPlayerLayer.self;
    }
    var playerlayer: AVPlayerLayer{
        return layer as! AVPlayerLayer;
    }
    var player: AVPlayer?{
        get{
            return playerlayer.player
        }
        set {
            playerlayer.player = newValue
        }
    }
    var playetitem: AVPlayerItem?


}

я назначил элемент uivew в uicollectioncell этому классу (используя раскадровку) avplayer начинает играть и добавляет наблюдения при нажатии play в uicollectioncell

@IBAction func play(_ sender: Any) {
        activityindicator.isHidden = false
        activityindicator.startAnimating()
        self.butttoonheight.isHidden = true
        self.postimage.isHidden = true
        let url2 = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
        let avplayer = AVPlayer(url: url2! )
        let playeritem = AVPlayerItem(url: url2!)
        //videoss is class of type uiview
        videoss.playetitem = playeritem
        videoss.playerlayer.player = avplayer
      videoss.player?.play()
        videoss.player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)
        videoss.player?.addObserver(self, forKeyPath: "rate", options: .new
            , context: nil)
         videoss.player?.addObserver(self, forKeyPath: "currentItem.playbackBufferEmpty", options: .new, context: nil)
        playying.isHidden = false
    }

//observing when video is playing


//playpause button to play or pause video while bad network is present video is stuck on first frame and playorpause is not changing while pressed
     @IBAction func playorpause(_ sender: Any) {
            if videoss.player?.timeControlStatus == AVPlayerTimeControlStatus.paused{
                videoss.player?.play()
                playying.setImage(UIImage(named: "pas50"), for: .normal)
            }
            if videoss.player?.timeControlStatus == AVPlayerTimeControlStatus.playing{
                videoss.player?.pause()
                playying.setImage(UIImage(named: "p24"), for: .normal)
            }
        }
        override public func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
            if keyPath == "rate"{
                print(videoss.player?.rate)
                if  videoss.player?.rate == 0.0 {
                    print("dawdaopwdaopwdipo")
                }
            }
            if keyPath == "currentItem.loadedTimeRanges"{
                print("its is working")
                activityindicator.stopAnimating()
                activityindicator.isHidden = true
            }
            if keyPath == "currentItem.playbackBufferEmpty"
            {
                activityindicator.startAnimating()
                activityindicator.isHidden = false
                print("pkawdawdawd")
            }

        }

1 Ответ

0 голосов
/ 02 июля 2018

Я решил эту проблему, добавив таймер, который запускается каждые 0,3 секунды, каждые 0,3 секунды он проверяет текущее время видео, если текущее время равно предыдущему времени, тогда видео не воспроизводится, отображается индикатор активности, если не видео при воспроизведенииИндикаторы активности были скрыты, также вам нужно проверить, не приостановили ли пользователи видео, преимущество в том, что вы также получаете текущее время в той же функции.То, что я пробовал, также видел скорость видео, но по медленному интернету скорость всегда давала то, что играет, но это не так, что не помогло

...