5

W iOS 9 MPMoviePlayer i wszystkie jego składniki są przestarzałe. Wykorzystaliśmy powiadomienia MPMoviePlayerController, takie jak MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification, do śledzenia jakości usług wideo. Ale teraz z AVPlayerViewController nie mogę znaleźć odpowiedniego zamiennika dla tych powiadomień.Jak wymienić powiadomienia MPMoviePlayer?

Jak wymienić te powiadomienia teraz?

Odpowiedz

5

AVPlayerViewController jest bardzo różne w użyciu od MPMoviePlayerViewController. Zamiast korzystać z powiadomień, korzystasz z funkcji Key Value Observing w celu określenia aktualnej charakterystyki obiektu AVPlayer związanej z obiektem AVPlayerViewController. Zgodnie z dokumentami:

Możesz obserwować status gracza za pomocą obserwacji klucz-wartość. Tak więc , że można bezpiecznie dodawać i usuwać obserwatorów, AVPlayer serializuje powiadomienia o zmianach, które występują dynamicznie podczas odtwarzania w kolejce wysyłkowej . Domyślnie ta kolejka jest główną kolejką (patrz dispatch_get_main_queue). Aby zapewnić bezpieczny dostęp do nieatomowych właściwości odtwarzacza , podczas gdy dynamiczne zmiany w stanie odtwarzania mogą być zgłaszane , należy serializować dostęp za pomocą kolejki powiadomień odbiornika . W powszechnym przypadku taka serializacja jest naturalnie osiągnięta przez wywoływanie różnych metod AVPlayera w głównym wątku lub kolejce.

Na przykład, jeśli chcesz wiedzieć, gdy gracz został wstrzymany dodać obserwatora na własność przedmiotu AVPlayerrate:

[self.player addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: &PlayerRateContext]; 

Następnie w The Observer Sprawdzić metodę jeżeli wartość new jest równa zeru:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { 
    if (context == &PlayerRateContext) { 
     if ([[change valueForKey:@"new"] integerValue] == 0) { 
      // summon Sauron here (or whatever you want to do) 
     } 
     return; 
    } 

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    return; 
} 

wiele właściwości na AVPlayer są obserwowalne. Przejdź przez Class reference.

Oprócz tego istnieje kilka powiadomień dostępnych dla obiektu AVPlayerItem, które są ograniczone, ale nadal pomocne.

Powiadomienia

AVPlayerItemDidPlayToEndTimeNotification

AVPlayerItemFailedToPlayToEndTimeNotification

AVPlayerItemTimeJumpedNotification

AVPlayerItemPlaybackStalledNotification

AVPlayerItemNewAccessLogEntryNotifi kation

AVPlayerItemNewErrorLogEntryNotification

znajdę AVPlayerItemDidPlayToEndTimeNotification szczególnie przydatnych do poszukiwania element do startu po zakończeniu odtwarzania.

Stosując te dwie opcje razem powinieneś być w stanie zastąpić większość, jeśli nie wszystkie powiadomienia o MPMoviePlayerController

+0

Cóż, to wygląda na dużo pracy. Dziękuję Ci. –

+0

Czy możesz również podać listę powiadomień JWPlayer? Nie można znaleźć zwięzłej listy w sieci. –

+0

Jak przekonwertować MPMoviePlayerPlaybackStateDidChangeNotification w AVPlayer? –

1

Spojrzałem na dokumentację dla obu MPMoviePlayerNotifications i AVPlayerItemNotifications i zauważyłem dwie rzeczy.

  1. MPMoviePlayerNotifications nie wykazują one były przestarzałe:

    enter image description here

  2. AVPlayerItemNotifications nie mają żadnych zamienników, które widziałam:

    enter image description here

S o, jestem zdezorientowany, że mówisz, że MPMoviePlayerNotifications są przestarzałe, ponieważ docs twierdzą, że są one dostępne. Ponadto, nie sądzę, że AVPlayerItemNotifications ma zamiennik dla MPMoviePlayerNotifications.

+1

z dokumentacji: (. Klasa MPMoviePlayerController również formalnie niezalecane) 'Klasa MPMoviePlayerViewController jest formalnie w iOS 9. nieaktualnych Aby odtwarzać zawartość wideo w systemie iOS 9 i nowszych wersjach, zamiast tego należy użyć klasy AVPictureInPictureController lub AVPlayerViewController ze struktury AVKit lub klasy WKWebView z WebKit'. Przypuszczam, że oznacza to brak powiadomień 'MPMoviePlayerNotifications' w przyszłości. –