未从服务器

时间:2017-06-11 14:58:07

标签: ios swift video avplayer

我有一个scrollView,其中有很多页面(pagingEnabled设置为true)。每个页面都包含一个覆盖整个屏幕的视频,并使用您将在下面找到的功能加载。如上所述,视频是从我的服务器流式传输的。但是我经常遇到一个问题,即某些视频没有加载,而其他视频是scrollView。有时第三个没有加载,有时是第一个,有时两个中有两个没有加载。为什么会发生这种情况?

我真的很想知道如何确保所有视频都被加载或者(最好)一次只加载一个视频(预先加载),因为我认为它超出了带宽(一个视频在一个当前可见的页面,或者更确切地说是下一页中的视频(或者我是否需要担心需要缓存的视频,因为视频总是需要重新加载?))?

除此之外,我想提一下每个页面都有单独的视频(来自阵列)。因此,我从我的类中传递每个视频的链接,创建scrollView来生成JSON请求并将数组(HomeController)添加到设置视频的类(PlayerView)在每个页面上。因此,仅在设置了某个变量urlString之后才调用设置视频的功能。

PlayerView

//if set call function (set in the viewcontroller `HomeController`)
var urlString: String? {

    didSet {

        setupPlayerView()

    }

}

//...

//defined here to use somewhere else...
var player: AVPlayer?

//setup video player
func setupPlayerView() {

    //check URL if can be converted to NSURL, self.urlString instead of string
    if let urlString = self.urlString, let videoURL = NSURL(string: urlString){

        //player's video
        if self.player == nil {

            player = AVPlayer(url: videoURL as URL)

        }

        //add sub-layer
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.frame
        self.controlsContainerView.layer.insertSublayer(playerLayer, at: 0)

        //when are frames actually rendered (when is video loaded so spinner disappears)
        player?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

        //loop through video
        NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil, using: { (_) in
            DispatchQueue.main.async {
                self.player?.seek(to: kCMTimeZero)
                self.player?.play()
            }
        })

    }

}

0 个答案:

没有答案