我在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会比我告诉的地方跳三秒之多,又如何说服它跳到我要求的那一刻呢?
最佳答案
我误解了容忍度,让它们倒退了。
每个公差是允许AVPlayer在该方向上偏离请求时间的距离。因此,为toleranceBefore
传递正无穷大表示“您可以按需要尽早”,为toleranceAfter
传递零为无条件表示“只是不要迟到”(这对于寻求结束)。
因此,解决方案是切换值:
[self.player seekToTime:self.player.currentItem.duration
toleranceBefore:kCMTimeZero
toleranceAfter:kCMTimePositiveInfinity];
或者,用英语:“不要早,但可以根据需要迟到。”
关于macos - 在AVPlayer中精确寻找,而不是短于两秒,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14168590/