【问题标题】:AVPlayer stops playing video after bufferingAVPlayer 缓冲后停止播放视频
【发布时间】:2018-11-06 07:59:45
【问题描述】:

当我从互联网加载视频(10-40MB 大)时,我无法提供流畅的播放体验。

我的 AVPlayer 要么加载整个视频然后播放它,要么播放 1 秒、缓冲然后停止播放。

我尝试了无穷无尽的库、缓冲区观察器方法和教程。似乎没有任何帮助。

    .
    .
    .

    self.makeLoaderVisible()

    let playerItem = AVPlayerItem(url: url)
    playerItem.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .new, context: nil)
    playerItem.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .new, context: nil)
    playerItem.addObserver(self, forKeyPath: "playbackBufferFull", options: .new, context: nil)

    avPlayer?.replaceCurrentItem(with: playerItem)
    avPlayer?.automaticallyWaitsToMinimizeStalling = false
    avPlayer?.playImmediately(atRate: 0)
//  avPlayer?.play()

    }


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if object is AVPlayerItem {
        switch keyPath! {
        case "playbackBufferEmpty":
            // Show loader
            makeLoaderVisible()

        case "playbackLikelyToKeepUp":
            // Hide loader
            hideLoader()

        case "playbackBufferFull":
            // Hide loader
            hideLoader()

        default:
            return
        }
    }
}

【问题讨论】:

标签: ios swift avfoundation avplayer avkit


【解决方案1】:

iOS 10.x 开始,您可以进行一些缓冲设置,例如您可以决定缓冲视频需要多少秒:

    if #available(iOS 10.0, tvOS 10.0, OSX 10.12, *) {
        avPlayer?.automaticallyWaitsToMinimizeStalling = .playWhenBufferNotEmpty
        //preferredForwardBufferDuration -> default is 0, which means `AVPlayer` handle it independently, try more seconds like 5 or 10.
        playerItem.preferredForwardBufferDuration = TimeInterval(5) 
    }

【讨论】:

  • avPlayer?.automaticallyWaitsToMinimizeStalling = .playWhenBufferNotEmpty。不起作用,因为它接受布尔值 true 或 false
  • @DavenderVerma 你的问题是什么 iOS 版本?
  • cell.viewForVideo.player?.automaticallyWaitsToMinimizeStalling = .play。导致错误
  • 试试:player?.automaticallyWaitsToMinimizeStalling = playerItem?.isPlaybackBufferEmpty ?? false,其中player 是你的avPlayerplayerItem 是你的 AVPlayerItem,祝你好运。
  • @Alessamdro。 cell.viewForVideo.player?.automaticallyWaitsToMinimizeStalling = cell.viewForVideo.player?.currentItem?.isPlaybackBufferEmpty ?? false cell.viewForVideo.player?.currentItem?.preferredForwardBufferDuration = TimeInterval(5) cell.viewForVideo.player?.playImmediately(atRate: 1.0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多