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

17

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

Это не :

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

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

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

[playerItem seekToTime:timeInTheMiddleOfTheVideo completionHandler:myHandler];

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

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

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

    
задан Besi 26.08.2012 в 23:36
источник
  • Вы говорите, что это работает, если вы его задерживаете? –  Carl Veazey 26.08.2012 в 23:58
  • См. обновленный ответ –  Besi 27.08.2012 в 00:06
  • Вы уверены, что передаете действительный аргумент времени? Какова ценность timeInTheMiddleOfTheVideo? –  Carl Veazey 27.08.2012 в 00:07
  • Видеоролик составляет около 30 минут. Я также пробовал CMTimakewotgseconds (15,1), который определенно находится внутри границ –  Besi 27.08.2012 в 00:08
  • Вы говорите, что это работает после воспроизведения. Может быть, глупый вопрос в моем конце, но что происходит, если вы играете, а затем сразу ищете? –  Carl Veazey 27.08.2012 в 00:13
Показать остальные комментарии

2 ответа

42

Пара вещей, которые могут вам помочь:

  1. Проверяя, готов ли плеер к воспроизведению, я проверяю как сам плеер, так и текущий элемент игрока.

    if(self.player.status == AVPlayerStatusReadyToPlay &&
       self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) {
        [self.player play];
    }
    
  2. Возможно, если вы ищете, например, 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];
    
ответ дан darvids0n 27.08.2012 в 04:23
источник
  • +1 точное решение. –  Paresh Navadiya 22.04.2013 в 11:30
  • Разве AVPlayerStatusReadyToPlay не будет лучшим способом проверить? Почему вы проверяете статус товара? –  Andy 16.04.2014 в 14:13
  • Я столкнулся с ситуациями, когда игрок будет готов, но элемент не готов, или наоборот. В документации [AVPlayer status] говорится: «Указывает, что плеер готов к воспроизведению экземпляров AVPlayerItem». и [Состояние AVPlayerItem] «Элемент готов к воспроизведению». Таким образом, существует разница между возможностью играть в предметы, а текущий элемент фактически готов. –  darvids0n 17.04.2014 в 04:32
  • Я использую только AVPlayerItemStatusReadyToPlay –  onmyway133 06.09.2014 в 16:55
  • Отличный ответ. Особенно для более коротких видеороликов, допуск kCMTimeZero не имеет никакой задержки и показывает очень плавный переход. –  trdavidson 20.09.2015 в 21:27
Показать остальные комментарии
0

Метод seektotime, который я использовал, лишен iOS 11. Вот новый способ с обработчиком завершения.

После iOS 11

[self.audioItem seekToTime:resultTime completionHandler:^(BOOL finished){
}];
    
ответ дан Dave Strand 31.12.2017 в 17:11
источник