2012-05-18 7 views
15

Mam kilka pytań związanych z AVPlayer którymi są:AVPlayer buforowanie, zatrzymując się powiadomienie, a plakat rama

  1. Kiedy wstrzymać AVPlayer przez [player pause] robi AVPlayer zachować buforowania wideo z sieci lub robi to tylko zatrzymać? Nie mogłem uzyskać żadnych informacji związanych z tym w dokumentacji Apple. Czy możliwe jest zmuszenie AVPlayera do utrzymywania buforowania w trybie pauzy, więc jeśli mamy wstrzymane wideo, które czeka na zakończenie pierwszego filmu, nie znajdziemy żadnej przerwy pomiędzy filmami?

  2. Po wstrzymaniu AVPlayer możemy mieć dowolne zdarzenie na [player pause].

  3. Czy możemy przez kilka sekund wyświetlać nieruchomy obraz na AVPlayer?

Dzięki

+0

Sprawdź AVQueuePlayer, aby odtwarzać sekwencje bez przerw. – MikeyWard

+0

Użyłem go już, nie obsługuje on przesyłanej strumieniowo treści audio/wideo, zrobiłem to już przy użyciu AVPlayera. Dzięki –

+0

@OmerWaqasKhan Użyj Charlesa, aby obserwować pakiet sieciowy twojej aplikacji, i widzisz, że gracz nadal wysyła żądania sieciowe, gdy zatrzymał się na – onmyway133

Odpowiedz

35

1) AVPlayer będzie buforowania wideo w kilku przypadkach, żaden Cleary udokumentowane. Powiedziałbym, że możesz oczekiwać buforowania po zainicjowaniu wideo i po wymianie bieżącego elementu. Możesz obserwować currentItem.loadedTimeRanges, aby wiedzieć, co się dzieje. Ta właściwość pokaże, które zakresy czasu wideo zostały załadowane.

Istnieje również kilka innych właściwości currentItem, które mogą Ci pomóc: playbackLikelyToKeepUp, playbackBufferFull i playbackBufferEmpty.

Osiągnięcie doskonałego odtwarzania bez przerw nie jest łatwe.

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

W 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) Wystarczy pilnować player.rate.

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

Następnie w 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) Można build a movie of a given length using a still image ale łatwiej jest użyć zwykłej UIImageView na górze odtwarzacza. Ukryj/pokaż w razie potrzeby.

Przykładowy projekt: zachęcamy do gry z the code I wrote to support my answer.

+1

thanx madmw, czy możemy zmusić avplayera do zachowania buforowania w stanie pauzy? –

+0

AFAIK nie ma publicznych api do pracy z buforem AVPlayer.Jeśli chcesz zachować buforowanie poza punktem pauzy, możesz sfałszować pauzę: kontynuuj odtwarzanie w/poza głośnością i przy ukrytym widoku, a następnie użyj seekToTime, aby wznowić odtwarzanie. – djromero

+0

Dzięki za to! Konkretny przykład bardzo pomógł. – user2734823