Ищите определенную позицию в AVPlayer сразу после загрузки актива
Это работает: У меня есть AVPlayer
, который воспроизводит видео сразу после его загрузки. И это прекрасно работает.
Это не:
Вместо начала видео в начале, я хочу воспроизвести его в заданной позиции. Поэтому я жду, пока актив не будет готов к воспроизведению с использованием KVO:
BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)
И затем ищите заданное время
[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];
Но игрок всегда будет начинать в начале видео в исходном поиске.
Обновление
Я попробовал dispatch_after через несколько секунд, но это тоже не сработает. Он работает после воспроизведения, но не изначально.
Когда я наблюдаю self.player.currentItem.duration
, я продолжаю получать 0
как value
и timescale
.
Ответы
Ответ 1
Пара вещей, которые могут вам помочь:
-
Проверяя, готов ли плеер к воспроизведению, я проверяю как сам плеер, так и текущий элемент игрока.
if(self.player.status == AVPlayerStatusReadyToPlay &&
self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
[self.player play];
}
-
Возможно, если вы ищете, например, 15 секунд он может начинаться с начала видео, если это местоположение ближайшего ключевого кадра. Чтобы заставить игрока искать точное местоположение (обратите внимание: это займет несколько секунд), выполните следующее:
Float64 seconds = 500.0f;
CMTime targetTime = CMTimeMakeWithSeconds(seconds, NSEC_PER_SEC);
[self.player seekToTime:targetTime
toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
Или вы можете искать ключевой кадр явно до/после указанной точки, указав один из аргументов как бесконечность:
[self.player seekToTime:targetTime
toleranceBefore:kCMTimePositiveInfinity toleranceAfter:kCMTimeZero];
Ответ 2
Метод seektotime, который я использовал, лишен iOS 11.. Здесь новый способ с обработчиком завершения.
После iOS 11
[self.audioItem seekToTime:resultTime completionHandler:^(BOOL finished){
}];