AVPlayer无法播放

3
在我的项目中,我使用了 Kolada 视图 (here) 来呈现一堆带有视频的卡片。有时,在加载下一个视频时,我的 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 的初始化器吗? - Mostafa Berg
AVPlayer是否只有一个实例和一个观察者来跟踪所有卡片视图中视频的结束? - Kumar Swamy
你在加载下一个视频时,是否删除了之前的视频? - Godinall
1个回答

3

使用AVPlayer对象的现有实例上的replaceCurrentItemWithPlayerItem方法,将值设置为nil来销毁它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接