5

In iOS 9 MPMoviePlayer e tutti i suoi componenti sono deprecati. Abbiamo usato le notifiche MPMoviePlayerController, come MPMoviePlayerLoadStateDidChangeNotification, MPMovieDurationAvailableNotification, MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerReadyForDisplayDidChangeNotification, per monitorare la qualità del servizio video. Ma ora con AVPlayerViewController non riesco a trovare correttamente la sostituzione di queste notifiche.Come posso sostituire le notifiche di MPMoviePlayer?

Come si sostituiscono ora queste notifiche?

risposta

5

AVPlayerViewController è molto diverso nel suo utilizzo dal MPMoviePlayerViewController. Invece di utilizzare le notifiche, si utilizza Key Value Observing per determinare le caratteristiche correnti dell'oggetto AVPlayer associato allo AVPlayerViewController. Secondo i documenti:

È possibile osservare lo stato di un lettore utilizzando l'osservazione dei valori-chiave. Quindi, che puoi aggiungere e rimuovere gli osservatori in modo sicuro, AVPlayer serializza le notifiche delle modifiche che si verificano in modo dinamico durante la riproduzione su una coda di invio . Per impostazione predefinita, questa coda è la coda principale (vedere dispatch_get_main_queue). Per garantire un accesso sicuro alle proprietà non anatomiche del lettore mentre le modifiche dinamiche nello stato di riproduzione potrebbero essere segnalate, è necessario serializzare l'accesso con la coda di notifica del ricevitore . Nel caso comune, tale serializzazione viene naturalmente raggiunta da invocando i vari metodi di AVPlayer sul thread principale o sulla coda.

Per esempio, se volete sapere quando il giocatore è stato messo in pausa aggiungere un osservatore sulla rate proprietà dell'oggetto AVPlayer:

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

Poi nel controllo di osservare metodo se il valore new è pari a zero:

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

Un sacco di proprietà sulla AVPlayer sono osservabili. Passare attraverso lo Class reference.

Oltre a questo ci sono diverse notifiche disponibili per l'oggetto AVPlayerItem che sono limitate ma comunque utili.

Notifiche

AVPlayerItemDidPlayToEndTimeNotification

AVPlayerItemFailedToPlayToEndTimeNotification

AVPlayerItemTimeJumpedNotification

AVPlayerItemPlaybackStalledNotification

AVPlayerItemNewAccessLogEntryNotifi cazione

AVPlayerItemNewErrorLogEntryNotification

trovo AVPlayerItemDidPlayToEndTimeNotification particolarmente utile per cercare la voce al punto di partenza, una volta la riproduzione è terminata.

L'utilizzo di queste due opzioni insieme si dovrebbe essere in grado di sostituire la maggior parte, se non tutte le notifiche per l'MPMoviePlayerController

+0

Beh, sembra molto lavoro. Grazie. –

+0

Puoi anche fornire un elenco di notifiche JWPlayer? Impossibile trovare una lista concisa in rete. –

+0

Come posso convertire MPMoviePlayerPlaybackStateDidChangeNotification in AVPlayer? –

1

Ho esaminato la documentazione sia per MPMoviePlayerNotifications e AVPlayerItemNotifications e noto due cose.

  1. MPMoviePlayerNotifications non mostrano sono stati deprecati:

    enter image description here

  2. AVPlayerItemNotifications non hanno eventuali sostituzioni che ho potuto vedere:

    enter image description here

S o, sono confuso che tu stia dicendo che lo MPMoviePlayerNotifications è deprecato, perché i documenti dicono che sono disponibili. Inoltre, non credo che AVPlayerItemNotifications abbia una sostituzione per MPMoviePlayerNotifications.

+1

Da documentazione: (. La classe MPMoviePlayerController è anche formalmente deprecato) 'La classe MPMoviePlayerViewController è formalmente sconsigliato in iOS 9. Per riprodurre contenuti video in iOS 9 e versioni successive, utilizzare invece la classe AVPictureInPictureController o AVPlayerViewController dal framework AVKit o la classe WKWebView di WebKit'. Immagino che ciò significhi nessuna notifica di 'MPMoviePlayerNotifications' in futuro. –

Problemi correlati