如何控制AVPlayer缓冲

问题描述

我正在使用AVPlayer播放远程渐进式下载(即非HLS)视频。但是,我不知道如何控制其缓冲行为。

我想在视频准备播放之前预取2秒钟,并希望在视频暂停时停止缓冲。

这是我的设置:

let asset = AVURLAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
let player = AVPlayer()

我尝试了以下操作,但没有成功:

// doesn't start buffering
playerItem.preferredForwardBufferDuration = 2.0
// doesn't stop buffering
playerItem.preferredForwardBufferDuration = 2.0
player.replaceCurrentItem(with: playerItem)

我在两种情况下都尝试了player.automaticallyWaitsToMinimizeStalling = true,并且与各种player.pause()player.rate = 0结合使用-不起作用。

想到的一种潜在方法是观察loadedTimeRanges直到加载前2秒钟,并将播放器的当前项目设置为nil

let c = playerItem.publisher(for: \.loadedTimeRanges,options: .new)
                  .compactMap { $0.first as? CMTimeRange }
                  .sink { 
                      if $0.duration.seconds - $0.start.seconds > 2 {
                         player.replaceCurrentItem(with: nil)

                      }
                  }

这适用于预缓冲,但不适用于暂停,因为它会使视频空白而不是暂停。 (在这一点上,我觉得我正在尝试重新实现/干扰某些核心缓冲功能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)