5

In iOS 9 MPMoviePlayer und alle seine Komponenten sind veraltet. Wir haben MPMoviePlayerController-Benachrichtigungen wie MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification verwendet, um die Video-Servicequalität zu verfolgen. Aber jetzt mit AVPlayerViewController kann ich nicht richtig Ersatz für diese Benachrichtigungen finden.Wie ersetze ich MPMoviePlayer Benachrichtigungen?

Wie ersetze ich diese Benachrichtigungen jetzt?

Antwort

5

AVPlayerViewController ist in seiner Verwendung von der MPMoviePlayerViewController viel anders. Anstatt Benachrichtigungen zu verwenden, verwenden Sie Schlüsselwertbeobachtung, um die aktuellen Merkmale des Objektszu ermitteln, das mit der AVPlayerViewController verknüpft ist. Gemäß der Dokumentation:

Sie können den Status eines Players mithilfe der Schlüsselwertüberwachung beobachten. So , dass Sie Beobachter sicher hinzufügen und entfernen können, serialisiert AVPlayer Benachrichtigungen von Änderungen, die dynamisch während der Wiedergabe in einer Dispatch-Warteschlange auftreten. Standardmäßig ist diese Warteschlange die Hauptwarteschlange (siehe dispatch_get_main_queue). Um einen sicheren Zugriff auf die nichtatomaren Eigenschaften eines Players zu gewährleisten, während dynamische Änderungen im Wiedergabestatus gemeldet werden können, müssen Sie den Zugriff mit der Benachrichtigung des Empfängers serialisieren. Im allgemeinen Fall wird eine solche Serialisierung natürlich durch erreicht, indem die verschiedenen Verfahren von AVPlayer auf dem Haupt-Thread oder der Warteschlange aufgerufen werden.

Zum Beispiel, wenn Sie wissen möchten, wenn Sie den Player angehalten wurde auf der rate Eigenschaft des AVPlayer Objekts einen Beobachter hinzu:

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

Dann im beobachten Verfahren prüfen, ob der new Wert ist gleich Null:

- (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; 
} 

sind viele Eigenschaften auf der AVPlayer beobachtbar. Gehe durch die Class reference.

Auch abgesehen davon gibt es mehrere Benachrichtigungen für die AVPlayerItem Objekt, die begrenzt sind, aber immer noch hilfreich.

Benachrichtigungen

AVPlayerItemDidPlayToEndTimeNotification

AVPlayerItemFailedToPlayToEndTimeNotification

AVPlayerItemTimeJumpedNotification

AVPlayerItemPlaybackStalledNotification

AVPlayerItemNewAccessLogEntryNotifi

Kation

AVPlayerItemNewErrorLogEntryNotification

I AVPlayerItemDidPlayToEndTimeNotification besonders nützlich finden Sie die Artikel an den Start zu suchen, sobald die Wiedergabe beendet hat.

Mit diesen beiden Optionen zusammen sollten Sie in der Lage sein, die meisten zu ersetzen, wenn nicht alle Benachrichtigungen für die MPMoviePlayerController

+0

Nun, das sieht nach einer Menge Arbeit aus. Vielen Dank. –

+0

Können Sie auch eine Liste der JWPlayer-Benachrichtigungen bereitstellen? Konnte keine übersichtliche Liste im Internet finden. –

+0

Wie konvertiere ich MPMoviePlayerPlaybackStateDidChangeNotification in AVPlayer? –

1

Ich sah die Dokumentation für beide MPMoviePlayerNotifications und AVPlayerItemNotifications und ich bemerke zwei Dinge.

  1. MPMoviePlayerNotifications nicht zeigen sie veraltet waren:

    enter image description here

  2. AVPlayerItemNotifications keine Auswechslungen, die ich sehen konnte:

    enter image description here

S o, ich bin verwirrt, dass Sie sagen, MPMoviePlayerNotifications sind veraltet, weil die Dokumente sagen, sie sind verfügbar. Außerdem glaube ich nicht AVPlayerItemNotifications hat einen Ersatz für MPMoviePlayerNotifications.

+1

Aus Dokumentation: (. Die MPMoviePlayerController Klasse auch formal veraltet) 'Die MPMoviePlayerViewController Klasse in iOS formal veraltet 9. Um Videoinhalte in iOS 9 und höher wiederzugeben, verwenden Sie stattdessen die AVPictureInPictureController- oder AVPlayerViewController-Klasse aus dem AVKit-Framework oder die WKWebView-Klasse aus WebKit. Ich denke, das bedeutet in Zukunft keine 'MPMoviePlayerNotifications' Benachrichtigungen. –