Стремление точно, в отличие от двух секунд в 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)