tvOS - потоковая передача видео останавливается из-за PlayBufferEmpty и никогда не возобновляется - PullRequest
0 голосов
/ 21 декабря 2018

Я использую AVPlayerController по умолчанию для воспроизведения моего видео в tvOS.[tvOS 12.1.1]

Иногда из-за проблем с сетью или пропускной способностью видео перестает воспроизводиться из-за воспроизведениеBufferEmpty.

В этом случае я заметил, что

  1. PlayLikelyToKeepUp = false
  2. PlayBufferFull = false
  3. playbufferEmpty = true
  4. playerView скорость составляет 0,0
  5. playerView timeControlStatus приостановлено
  6. playerViewили нам нужно программно запустить для возобновления видео, останавливается ли оно для воспроизведения? Когда происходит пустое воспроизведениеBuffer, я вызываю эту функцию handleBufferEmptyCase () Даже после вызова этой функции я заметилвидео все еще останавливается и никогда не возобновляется.Случаи, которые я наблюдал при остановке видео, если я пытаюсь воспроизвести другое видео, оно воспроизводится без перерыва в течение как минимум 45 минут, и снова видео останавливается.У меня хорошая пропускная способность для воспроизведения потокового видео в реальном времени. Фрагмент кода: func observeCurrentPlayingVideo() { if currentItem.status == AVPlayerItem.Status.readyToPlay { if currentItem.isPlaybackLikelyToKeepUp { } else if currentItem.isPlaybackBufferEmpty { print("LiveVC | isPlaybackBufferEmpty...") perform(#selector(handleBufferEmptyCase), with: nil, afterDelay: 2) } else if currentItem.isPlaybackBufferFull { } } if currentItem.status == AVPlayerItem.Status.failed { } } func handleBufferEmptyCase() { if let currentItem = self.playerView.currentItem { if currentItem.isPlaybackBufferEmpty && !currentItem.isPlaybackLikelyToKeepUp && playerView.rate != 1 && playerView.timeControlStatus == .paused { print("handleBufferEmptyCase | Triggering to play again...") self.playerView.pause() self.playerView.play() } } } Я ожидаю продолжения воспроизведения и обеспечения продолжения видео даже после того, как произойдет bufferEmpty.

1 Ответ

0 голосов
/ 21 декабря 2018

Действительно, когда AVPlayer перестает играть из-за плохого соединения, AVPlayerItem имеет состояние отказа.Вы должны создать новый объект AVPlayerItem и использовать метод replaceCurrentItem(with:) AVPlayer.

Соответствующий способ узнать о статусе игрока - это проверить соответствующий коэффициент AVPlayerItem.0 означает, что игрок остановился.rate! = 0 означает, что игрок играет.

Также используйте уведомления AVPlayerItem, чтобы обнаружить что-то не так:

  • AVPlayerItemPlaybackStalled
  • AVPlayerItemFailedToPlayToEndTime
  • AVPlayerItemDidPlayToEndTime (может быть запущено, когда буфер пуст И сеть отсутствует)

Эта библиотека iOS ModernAVPlayer может помочь вам понять процесс.Проверьте файл PlayingState.swift и связанные службы.

...