【问题标题】:AVPlayer seek not always accurateAVPlayer 搜索并不总是准确的
【发布时间】:2021-08-26 07:27:24
【问题描述】:

我遇到了 AVPlayer seek 的问题。当前代码:

self.player?.seek(to: CMTime(seconds: Double(startSeconds), preferredTimescale: 600)

这在大约 80% 的时间里都有效。但有时它不会寻找正确的位置,而是从 0.0 重新开始。

我尝试过这种方式:

let time = CMTimeMake(value: Int64(startSeconds), timescale: 1)
self.player?.seek(to: time, toleranceBefore: .zero, toleranceAfter: .zero)

这在 100% 的情况下都有效,但搜索速度非常很慢。

我在这里做错了什么?

【问题讨论】:

    标签: ios swift avfoundation avplayer


    【解决方案1】:

    默认容差值为无穷大(未指定时),但通常与请求值的实际差异约为一秒 - 这允许搜索速度更快。

    如果在您的情况下它跳转到文件开头,可能是因为您的文件未正确编码。

    如果您无法更改文件的来源,您可以做的最好的事情是指定大于零的容差,但不要太大。像±1秒。您的容忍度越低,搜索的执行时间就越长,因此请尝试找到一些平衡点。

    【讨论】:

    • Tolerance 使用CMTime,我会像这样初始化:let tolerance = CMTimeMake(value: 1, timescale: 1) 吗?
    • @Kex 不,你可以使用秒初始化器:CMTime(seconds: 1, preferredTimescale: 44100)
    • @Kex 实际上你的变种也应该可以工作,但最好的方法是从你的资产中获取preferredTimescale
    • 你从哪里得到 44100?我也可以使用1 作为time 属性的时间刻度吗?
    • @Kex 44100 只是音频的默认时间刻度,对于视频默认时间刻度是 600(我应该在我的示例中使用它)。我想说您最好使用asset.tracks(withMediaType: .video).first?.naturalTimeScale 进行所有视频计算。在某些情况下1 会起作用,但这是一种不好的做法。
    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 2014-08-17
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2018-06-23
    相关资源
    最近更新 更多