首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVQueuePlayer seek(to:)和CMTime的问题

AVQueuePlayer seek(to:)和CMTime的问题
EN

Stack Overflow用户
提问于 2018-06-17 21:25:14
回答 1查看 337关注 0票数 3

我有一个AVQueuePlayer,我正试着在按下按钮的时候,向后寻找5秒钟。

我的代码如下:

代码语言:javascript
复制
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)
}

当我第一次按下seek back按钮时,它会返回正确的时间量(5秒),但每次按下之后,它都会从第一次seek back操作返回到新的时间。如果我让视频播放超过5秒并按下按钮,它将正确地向后查找5秒,但随后就会像上面那样卡住。

例如,我播放视频,在10秒的时候,我按下seek back按钮,播放器就会返回到5秒。然后我让玩家再玩1秒,并再次按下按钮,它只会返回到5秒的标记。如果我重复按下按钮,它只会返回到5秒标记。如果我让视频再播放10秒(总时间约15秒),并再次按下seek back按钮,播放器将会重新播放10秒,并表现出相同的行为。

我不确定这是否与此有关,但还有一个按钮可以在1.0、1.5和2.0之间切换播放速率。上述问题在所有3种回放速率下都会出现。

因为它是一个AVQueuePlayer,所以我也尝试了下面的实现,得到了相同的结果(它使用currentItem而不仅仅是播放器):

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-18 01:24:54

在胡乱摆弄之后,我想通了。出于某种原因,

代码语言:javascript
复制
seek(to:)

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

代码语言:javascript
复制
seek(to:toleranceBefore:toleranceAfter:)

使用kCMTimeZero函数处理之前和之后的公差,它工作得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50897101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档