AVQueuePlayer seek(to:) 和 CMTime 的问题
Posted
技术标签:
【中文标题】AVQueuePlayer seek(to:) 和 CMTime 的问题【英文标题】:Issue with AVQueuePlayer seek(to:) and CMTime 【发布时间】:2018-06-17 13:25:14 【问题描述】:我有一个 AVQueuePlayer,我正在尝试在按下按钮时回溯 5 秒。
我的代码如下:
func seekBack()
guard let currentTime = self.player?.currentTime() else return
let currentTimeSeconds = CMTimeGetSeconds(currentTime)
let newTimeSeconds = max(currentTimeSeconds - 5, 0)
let newTime = CMTimeMakeWithSeconds(newTimeSeconds, currentTime.timescale)
self.player?.seek(to: newTime)
我第一次按下回溯按钮时,它会回溯正确的时间量(5 秒),但随后每按一次,它就会从第一次回溯动作开始回溯到新的时间。如果我让视频播放超过 5 秒并按下按钮,它会正确回溯 5 秒,但然后像上面一样卡住。
例如,我播放视频,在 10 秒标记处,我按下回溯按钮,播放器回溯到 5 秒。然后我让玩家再玩 1 秒,然后再次按下按钮,它只会回到 5 秒标记处。如果我反复按下按钮,它只会返回到 5 秒标记。如果我让视频再播放 10 秒(总时间约为 15 秒),然后再次按下回溯按钮,播放器将回溯到 10 秒并表现出相同的行为。
我不确定这是否与此有关,但还有一个按钮可以在 1.0、1.5 和 2.0 之间切换播放速率。上述问题在所有 3 种播放速率下都出现。
由于它是AVQueuePlayer
,我还尝试了以下实现,结果相同(它使用currentItem
而不仅仅是播放器):
func seekBack()
guard let currentTime = self.player?.currentItem?.currentTime() else return
let currentTimeSeconds = CMTimeGetSeconds(currentTime)
let newTimeSeconds = max(currentTimeSeconds - 5, 0)
let newTime = CMTimeMakeWithSeconds(newTimeSeconds, currentTime.timescale)
self.player?.currentItem?.seek(to: newTime)
【问题讨论】:
【参考方案1】:搞砸了之后,我想通了。不知为何,
seek(to:)
似乎不起作用,但如果我使用
seek(to:toleranceBefore:toleranceAfter:)
kCMTimeZero
用于前后容差的函数,它工作正常。
【讨论】:
以上是关于AVQueuePlayer seek(to:) 和 CMTime 的问题的主要内容,如果未能解决你的问题,请参考以下文章
AVPlayerItem 的 selectedMediaOption(in:) 与 seek(to:) 调用后的可用选择选项不一致