在我的项目中,我使用Kolada视图(here)来呈现一堆卡片,每张卡片上都有一个视频。有时当我加载下一个视频时,我的AVPlayer
无法播放视频,它只会显示第一帧并被冻结。我使用几个观察者来追踪视频实际播放的时间,如果它可能跟上播放。如果观察员没有正确解除分配,观众是否会导致播放冻结?如果不是,还有什么会导致AVPlayer
播放停止播放?AVPlayer不播放
更新:我注意到playbackLikelyToKeepUp
有时不会被调用,而当发生这种情况时,即使我更改了播放器项目,AVPlayer
也不会再次调用它。因此,视频播放从不恢复。
init(frame: CGRect, mediaURL: NSURL, thumbURL: NSURL?, isLoop: Bool) {
self.mediaURL = mediaURL
self.isLoop = isLoop
let asset = AVAsset(URL: mediaURL)
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
player!.actionAtItemEnd = .None
super.init(frame: frame)
asset.loadValuesAsynchronouslyForKeys(["duration"], completionHandler: {() -> Void in
var error: NSError?
let keyStatus: AVKeyValueStatus = asset.statusOfValueForKey("duration", error: &error)
switch (keyStatus) {
case .Loaded:
let duration: CMTime = asset.duration
self.currentDuration = duration
self.delegate?.updateDuration()
default:
break
}
})
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: #selector(MediaPlayerView.playerItemDidReachEnd(_:)),
name: AVPlayerItemDidPlayToEndTimeNotification,
object: player!.currentItem)
self.timeObserver = self.player!.addPeriodicTimeObserverForInterval(CMTimeMakeWithSeconds(1.0/30.0, Int32(NSEC_PER_SEC)), queue: nil, usingBlock: {
[weak self] (time) -> Void in
if time.value > 0 {
self?.spinnerView?.stopAnimating()
if(self?.player != nil){
if(self?.player!.rate > 0){
self?.placeholderImageView?.hidden = true
}
}
let timeInSeconds = CMTimeGetSeconds(time)
self?.delegate?.playbackReachedTime(timeInSeconds)
}
})
player!.currentItem?.addObserver(self, forKeyPath: playbackLikelyToKeepUp, options: .New, context: &observationContext)
player!.addObserver(self, forKeyPath: "rate", options: .New, context: &observationContext)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(MediaPlayerView.playerIsTapped(_:)))
addGestureRecognizer(tapGesture)
}
是一个ViewController的初始化器? –
该avplayer作为唯一的一个实例和一个观察者在所有卡片视图中跟踪视频结尾 –
加载下一个视频时是否删除了上一个视频? – Godinall