2016-07-19 113 views
2

在我的项目中,我使用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) 
} 
+0

是一个ViewController的初始化器? –

+0

该avplayer作为唯一的一个实例和一个观察者在所有卡片视图中跟踪视频结尾 –

+0

加载下一个视频时是否删除了上一个视频? – Godinall

回答

2

在AVPlayer对象的现有实例上使用replaceCurrentItemWithPlayerItem,将值设置为零以销毁它。

+0

黄金答案.... –