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



ios avfoundation (1)

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

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

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

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

Спасибо


Answer #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 поверх проигрывателя. Скрыть / показать, когда это необходимо.

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





avplayer