2015-11-21 4 views
2

Возможно ли сохранить AVQueuePlayer активным, когда удаленный AVPlayerItem буферизуется?AVQueuePlayer - сохранять активным, пока элемент буферизируется

В настоящее время, когда элемент переходит в буферизации, остановки воспроизведения и вся информация, установленные MPNowPlayingInfoCenter удаляется - экран блокировки, командный центр, внешнее устройство и т.д.

Я тестировала AVPlayer/AVQueuePlayer для некоторых время, и кажется, что единственный вариант заключается в следующем:

  1. Наблюдайте дистанционного AVPlayerItem для playbackBufferEmpty
  2. Когда наблюдатель триггеры вставить новый AVPlayerItem Wi й пустой mp3-файл.
  3. Продолжайте следить за буфером удаленных элементов и как только он достигнет playbackLiciousToKeepUp, поменяйте местами на место и перейдите на дистанционный.

Проблема с этим методом заключается в том, что после перехода на пустой элемент AVQueuePlayer прекращает буферизацию пульта. Я установил прочную ссылку на оба элемента, а actionAtItemEnd - на AVPlayerActionAtItemEndNone. Сеть контролируется Чарльзом.

Есть ли другие способы достижения этого?

+0

Вы нашли способ сохранить буферные пульт? – svrs

ответ

0

Мне удалось сохранить воспроизведение активным, используя два экземпляра AVPlayer.

Первый экземпляр держит пульт дистанционного управления AVPlayerItem и второй пустой звуковой файл длиной всего несколько мс. При загрузке вы можете искать пустой элемент до конца.

Когда удаленный элемент переходит в буферизацию, приостановите его и проиграйте пустой файл. Поскольку это уже в конце, он будет удерживать сессию воспроизведения активным. Просто установите actionAtItemEnd на номер AVPlayerActionAtItemEndNone.

Несмотря на то, что это работает, вы можете испытать какое-то странное поведение, когда буфер удаленного элемента изменится на playbackLikelyToKeepUp, и вы поменяете игроков. Удаленный элемент может переместиться обратно на playbackBufferEmpty, и логика свопинга игрока может зависеть от бесконечного цикла.

Я решил эту проблему путем задержки обновления буфера:

-(void)setPendingBuffer:(PlayerItemBuffer)pendingBuffer { 

    _pendingBuffer = pendingBuffer; 

    if (self.bufferDispatchTimer.valid) { 
     [self.bufferDispatchTimer invalidate]; 
    } 
    self.bufferDispatchTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(bufferDispatchTimerDidFire) userInfo:nil repeats:NO]; 
}