Стремление точно, в отличие от двух секунд в AVPlayer

Я использую AVPlayer в приложении Cocoa, и я выполнил команду, которая перескакивает до конца видео.

Проблема заключается в том, что 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 прыгает на три секунды меньше, о чем я ему рассказывал, и как мне убедить его перейти к моменту, когда я попросил?

Ответ 1

Я неправильно понял допуски и сделал их в обратном направлении.

Каждый допуск заключается в том, насколько далеко в этом направлении AVPlayer позволяет отойти от запрошенного времени. Таким образом, передача положительной бесконечности для toleranceBefore означает "вы можете быть как можно раньше", а передача нуля для toleranceAfter означает "просто не опаздывайте" (это было бы аккуратным трюком при поиске конец).

Таким образом, решение заключается в переключении значений:

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

Или на английском языке: "Не будьте ранним, но вы можете быть как можно дольше".

Ответ 2

Вот быстрая версия ответа от @Peter Hosey:

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