Буферизация AVPlayer, приостановка уведомления и рамка плаката

У меня есть некоторые вопросы, связанные с AVPlayer, которые:

  • Когда мы приостанавливаем AVPlayer через [player pause], сохраняет ли AVPlayer буферизацию видео из сети или он просто останавливается? Я не мог получить информацию, связанную с этим, в документации Apple. Кроме того, возможно ли заставить AVPlayer сохранять буферизацию во время паузы, чтобы, если у нас есть приостановленное видео в ожидании окончания первого видео, мы не обнаружили бы никакого промежутка между видео?

  • При приостановке AVPlayer мы можем иметь какое-либо событие на [player pause].

  • Можем ли мы показать неподвижное изображение на AVPlayer в течение нескольких секунд?

Спасибо

Ответы

Ответ 1

1) AVPlayer будет буферизовать видео в нескольких случаях, ни одно не документированное. Я бы сказал, вы можете ожидать буферизации, когда вы запускаете видео, и когда вы заменяете текущий элемент. Вы можете наблюдать currentItem.loadedTimeRanges, чтобы узнать, что происходит. Это свойство сообщит вам, какие временные диапазоны видео были загружены.

Кроме того, существует несколько других currentItem свойств, которые могут вам помочь: playbackLikelyToKeepUp, playbackBufferFull и playbackBufferEmpty.

Достижение идеального безщелезного воспроизведения непросто.

/* player is an instance of AVPlayer */
[player addObserver:self 
         forKeyPath:@"currentItem.loadedTimeRanges" 
            options:NSKeyValueObservingOptionNew 
            context:kTimeRangesKVO];    

В observeValueForKeyPath:ofObject:change:context::

if (kTimeRangesKVO == context) {
   NSArray *timeRanges = (NSArray *)[change objectForKey:NSKeyValueChangeNewKey];
   if (timeRanges && [timeRanges count]) {
       CMTimeRange timerange = [[timeRanges objectAtIndex:0] CMTimeRangeValue];
       NSLog(@" . . . %.5f -> %.5f", CMTimeGetSeconds(timerange.start), CMTimeGetSeconds(CMTimeAdd(timerange.start, timerange.duration)));
   }
}

2) Следите за player.rate.

[player addObserver:self 
         forKeyPath:@"rate" 
            options:NSKeyValueObservingOptionNew 
            context:kRateDidChangeKVO];

Затем в observeValueForKeyPath:ofObject:change:context::

    if (kRateDidChangeKVO == context) {
        NSLog(@"Player playback rate changed: %.5f", player.rate);
        if (player.rate == 0.0) {
            NSLog(@" . . . PAUSED (or just started)");
        }
    }

3) Вы можете создать фильм определенной длины с использованием неподвижного изображения, но проще использовать обычный UIImageView поверх проигрывателя. Скрыть/показать его при необходимости.

Пример проекта: не стесняйтесь играть с код, который я написал для поддержки моего ответа.