【问题标题】:Seeking accurately, as opposed to two seconds short, in AVPlayer在 AVPlayer 中准确搜索,而不是短短两秒
【发布时间】:2013-01-05 04:30:38
【问题描述】:

我在一个 Cocoa 应用中使用 AVPlayer,并且我已经实现了一个跳转到视频结尾的命令。

问题是,AVPlayer 没有找到我告诉它的地方。

例如,我的其中一个视频时长为 4 分 14 秒。当我寻找到最后时,AVPlayer 寻找到 4 分 12 秒——短了 2 秒。如果我然后点击播放,播放器将播放两秒钟,然后到达终点。

我的第一次尝试是这样的:

[self.player seekToTime:self.player.currentItem.duration];

我已将其切换为:

[self.player seekToTime:self.player.currentItem.duration
        toleranceBefore:kCMTimePositiveInfinity
         toleranceAfter:kCMTimeZero];

没有一个比另一个更好。

我也尝试过寻找kCMTimePositiveInfinity。那时它只是不理我。

播放器是否已加载视频的那部分似乎并不重要。我什至可以追到未尽头,玩到真正的尽头,然后再试探到底,它会跳回未尽头。

差值并不总是两秒。在我的一些视频中,它或多或少完全正确,即使不完全正确,也非常接近真正的终点。至少在一个上,它缩短了三秒钟。长度似乎不是一个因素;所有这些长度都大致相同,除了一个长度超过一个小时,并且短到两秒。

那么,为什么 AVPlayer 比我告诉它的位置少了三秒,我如何说服它跳到我要求的那一刻?

【问题讨论】:

    标签: macos osx-lion avfoundation avplayer


    【解决方案1】:

    我误解了公差并将它们倒退了。

    每个容差是允许 AVPlayer 在该方向上偏离请求时间的距离。因此,为toleranceBefore 传递正无穷大是在说“你可以尽可能早”,而为toleranceAfter 传递零是在说“不要迟到”(这在寻求结束)。

    因此,解决方案是切换值:

    [self.player seekToTime:self.player.currentItem.duration
            toleranceBefore:kCMTimeZero
             toleranceAfter:kCMTimePositiveInfinity];
    

    或者,用英语:“不要早,但你可以尽可能晚。”

    【讨论】:

    • 设置 kCMTimePositiveInfinity 也帮助我避免在搜索时滑块向后移动。
    • 很好的答案,英文引述确实阐明了这个想法!谢谢
    • 对我有用的是toleranceBefore:kCMTimeZero, toleranceAfter:kCMTimeZero。感谢您的解决方案。
    【解决方案2】:

    这是@Peter Hosey 的快速回答版本:

    self.player.seekToTime(self.player.currentItem.duration,
                toleranceBefore: kCMTimeZero,
                toleranceAfter: kCMTimePositiveInfinity)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2016-01-26
      相关资源
      最近更新 更多