Подтвердить что ты не робот

Ищите определенную позицию в AVPlayer сразу после загрузки актива

Это работает: У меня есть AVPlayer, который воспроизводит видео сразу после его загрузки. И это прекрасно работает.

Это не:

Вместо начала видео в начале, я хочу воспроизвести его в заданной позиции. Поэтому я жду, пока актив не будет готов к воспроизведению с использованием KVO:

BOOL isReadyToSeek = (self.playerItem.status == AVPlayerStatusReadyToPlay)

И затем ищите заданное время

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

Но игрок всегда будет начинать в начале видео в исходном поиске.

Обновление Я попробовал dispatch_after через несколько секунд, но это тоже не сработает. Он работает после воспроизведения, но не изначально.

Когда я наблюдаю self.player.currentItem.duration, я продолжаю получать 0 как value и timescale.

4b9b3361

Ответ 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){
}];