问题描述
我正在使用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 (将#修改为@)