AVQueuePlayer的seek(to:)和CMTime存在问题

3
我有一个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而不仅仅使用player):
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个回答

3

折腾了一番,我终于搞明白了。出于某种原因,

seek(to:)

看起来不起作用,但如果我使用

seek(to:toleranceBefore:toleranceAfter:)

在编程中,如果使用kCMTimeZero 作为前后容差的函数,它可以很好地工作。


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