14

我在 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 比我告诉它的位置少了三秒,我如何说服它跳到我要求的那一刻?

4

2 回答 2

28

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

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

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

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

或者,用英语说:“不要早起,但你可以随心所欲地迟到。”</p>

于 2013-01-05T04:30:38.483 回答
2

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

self.player.seekToTime(self.player.currentItem.duration,
            toleranceBefore: kCMTimeZero,
            toleranceAfter: kCMTimePositiveInfinity)
于 2015-08-14T23:21:47.543 回答