AVQueuePlayer问题寻求(到:)和CMTime

时间:2018-06-17 13:25:14

标签: ios swift avfoundation avplayer avqueueplayer

我有一个让我发疯的问题。

我有一个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 个答案:

答案 0 :(得分:0)

乱搞之后,我想通了。出于某种原因,

seek(to:)

似乎不起作用,但如果我使用

seek(to:toleranceBefore:toleranceAfter:)
对于前后公差,

kCMTimeZero起作用,它可以正常工作。