在AVPlayer中准确地寻找,而不是两秒钟

时间:2013-01-05 04:30:38

标签: macos osx-lion avfoundation avplayer

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

问题是,AVPlayer没有寻求我告诉它的地方。

例如,我的一个视频是4分14秒。当我寻求结束时,AVPlayer寻求4分12秒 - 两秒钟。如果我然后点击播放,播放器将播放两秒钟,然后到达终点。

我的第一次尝试是:

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

我已将其改为:

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

两者都没有比另一个更好。

我也尝试过kCMTimePositiveInfinity。那时它只是忽略了我。

播放器是否已载入该部分视频似乎并不重要。我甚至可以寻求不完全结束,玩到真正的结局,然后再次尝试寻求到最后,它将跳回到不完全结束。

缺口并不总是两秒钟。在我的一些视频中,它或多或少地完全正确地工作,如果不完全正确,则跳得非常接近真实的结束。在至少一个,它短至三秒钟。长度似乎不是一个因素;所有这些都是大约相同的长度,除了一个,超过一个小时,并寻求短短两秒。

那么,为什么AVPlayer在我告诉它的地方跳了多达三秒钟,我怎么说服它跳到我要求的那一刻?

2 个答案:

答案 0 :(得分:24)

我误解了宽容并将它们倒退了。

每个容差都是允许AVPlayer离开请求时间的方向。因此,为toleranceBefore传递正无穷大就是说“你可以尽早得到”,而toleranceAfter传递零则说“只是不要迟到”(这将是一个巧妙的把戏)当寻求到最后)。

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

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

或者,用英语说:“不要早点,但你可以尽可能地迟到。”

答案 1 :(得分:1)

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

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