我有一个scrollView
,其中有很多页面(pagingEnabled
设置为true
)。每个页面都包含一个覆盖整个屏幕的视频,并使用您将在下面找到的功能加载。如上所述,视频是从我的服务器流式传输的。但是我经常遇到一个问题,即某些视频没有加载,而其他视频是scrollView
。有时第三个没有加载,有时是第一个,有时两个中有两个没有加载。为什么会发生这种情况?
我真的很想知道如何确保所有视频都被加载或者(最好)一次只加载一个视频(预先加载),因为我认为它超出了带宽(一个视频在一个当前可见的页面,或者更确切地说是下一页中的视频(或者我是否需要担心需要缓存的视频,因为视频总是需要重新加载?))?
除此之外,我想提一下每个页面都有单独的视频(来自阵列)。因此,我从我的类中传递每个视频的链接,创建scrollView
来生成JSON请求并将数组(HomeController
)添加到设置视频的类(PlayerView
)在每个页面上。因此,仅在设置了某个变量urlString
之后才调用设置视频的功能。
//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()
}
})
}
}