2012-01-31 7 views
6

Ho un'app che trasmette video dalla rete e la riproduce utilizzando un oggetto MPMoviePlayerController per la riproduzione sul dispositivo o tramite AirPlay.Risposta alle notifiche MPMoviePlayerController durante la riproduzione multimediale in background

L'app supporta il funzionamento in background e ha l'opzione 'audio' elencata all'interno della chiave UIBackgroundModes richiesta nel suo file plist.

Durante la riproduzione su AirPlay, l'app può essere spinta con successo sullo sfondo e il video continua a essere riprodotto correttamente. Fin qui tutto bene.

Secondo il Apple documentation:

Compresa la chiave audio racconta i quadri del sistema che dovrebbero continuare a giocare e fare i richiami necessari per l'applicazione ad intervalli appropriati. Se l'app non include questa chiave, qualsiasi audio riprodotto dall'app si interrompe quando l'app si sposta sullo sfondo.

Tuttavia, queste richiamate non vengono eseguite.

L'applicazione utilizza due tipi di callback: quelli associati con le notifiche MPMoviePlayerController e AVPlayer inviare durante la riproduzione insieme con richiamate basato timer che controllano la posizione di riproduzione e le statistiche delle prestazioni per scopi di monitoraggio.

guardando le note di Apple, che sarebbe certamente aspettarsi di ricevere il primo tipo di callback in modo che l'applicazione può rispondere a MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerPlaybackDidFinishNotification e MPMoviePlayerLoadStateDidChangeNotification, ma questo non accade.

Qualcuno sa se è possibile riceverli durante la riproduzione AirPlay in background e, in caso affermativo, come è stato ottenuto?

** Nota: l'app funziona correttamente quando è in esecuzione in primo piano e riceve le notifiche correttamente. È solo quando viene spinto in secondo piano e giocando su AirPlay che le notifiche non vengono ricevute.

Allo stesso modo, il video viene riprodotto correttamente su AirPlay sullo sfondo. Sono solo le notifiche che non vengono ricevute **

risposta

0

Per completezza, devo aggiungere che al momento credo non ci sia una soluzione a questo problema.

Ne ho discusso direttamente con Apple tramite il supporto tecnico e non sono disponibili soluzioni pratiche.

Questa funzionalità era necessaria per consentire all'applicazione di registrare statistiche sulla riproduzione del flusso a intervalli regolari. Mentre questo va bene quando il video viene riprodotto sullo schermo del dispositivo e su AirPlay mentre l'app è in primo piano, non è possibile farlo con l'app in background.

La soluzione sono andato con invece è quello di disabilitare il timer di inattività durante tutti tipi di riproduzione e per riattivare in seguito utilizzando:

[UIApplication sharedApplication].idleTimerDisabled = YES; 

e

[UIApplication sharedApplication].idleTimerDisabled = NO; 

Mentre questo non è una soluzione alla domanda originale, è una soluzione alternativa per evitare il problema in primo luogo.

2

In uno dei miei progetti ho fatto quello che hai fatto, e ha funzionato per me. Due differenze nel mio progetto:

  • Non sto streaming via AirPlay (riproduzione dispositivo),
  • Io sono solo la riproduzione di file audio.

mio step-by-step:

  • aggiungere l'opzione audio UIBackgroundModes nel file plist,
  • Registrati alla NotificationCenter per MPMoviePlayerPlaybackDidFinishNotification e MPMoviePlayerPlaybackStateDidChangeNotification con il seguente codice:

    [[NSNotificationCenter defaultCenter] 
           addObserver:self 
            selector:@selector(playbackStateChanged:) 
             name:MPMoviePlayerPlaybackStateDidChangeNotification 
            object:moviePlayer]; 
    
    [[NSNotificationCenter defaultCenter] 
           addObserver:self 
            selector:@selector(playbackEnded:) 
             name:MPMoviePlayerPlaybackDidFinishNotification 
            object:moviePlayer]; 
    

Funziona come un fascino.

+0

Sì, riprodurre l'audio tramite il dispositivo funziona correttamente. Sfortunatamente, sono impaurito AirPlay e i video necessari. – reddersky

+0

@virorum Se si rimuove l'airplay dall'equazione, vengono richiamati i callback? Se è così, suona come un bug di Apple. Altrimenti forse sarà così gentile da condividere il suo codice;) – Danra

+0

Le chiamate vengono fatte quando sono in primo piano. È solo quando giochi su AirPlay sullo sfondo che non lo fanno. Penso che potrebbe essere una cosa Apple però. – reddersky

4

Ho avuto questo problema e l'ho risolto anche se era qualche mese fa. Potrei inviarti tutta la mia lezione per la riproduzione di film se questo non funziona. Nota che sta usando il modello del controller di navigazione.

NOTA: questo è testato su iPad 2 non su iPhone.

mostro il mio VC in questo modo:

- (IBAction)playMovie:(id)sender { 

    MovieVC* movController = [[MovieVC alloc] initWithID:2]; 
    movController.view.backgroundColor = [UIColor blackColor]; 
    AppDelegate *appDel = [[UIApplication sharedApplication] delegate]; 

    [appDel.navigationController pushViewController:movController animated:NO]; 
    [movController release]; 
} 

Poi nella mia classe MovieVC View Controller Ho creato la riproduzione video come questo:

- (void)initMoviePlayer { 

    mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self getMovieURL]]; 

    mMoviePlayer.allowsAirPlay = YES; 

    mMoviePlayer.view.frame = [self.view bounds]; 

    mMoviePlayer.view.backgroundColor = [UIColor clearColor]; 

    mMoviePlayer.shouldAutoplay = YES; 

    mMoviePlayer.fullscreen = YES; 

    mMoviePlayer.scalingMode = MPMovieScalingModeAspectFit; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePreloadDidFinish:) 
              name:MPMoviePlayerLoadStateDidChangeNotification 
              object:mMoviePlayer]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(moviePlayBackDidFinish:) 
                name:MPMoviePlayerPlaybackDidFinishNotification 
              object:nil]; 
} 

Questo risolto per me, se doesn Risolvi i commenti e modifica male con l'intero file di classe.

+0

Sì, questo riceve correttamente le notifiche quando l'app è in primo piano, ma non quando è stata trasferita in background con un'app multi-tasking. – reddersky

+0

@virorum: ok a rischio di sembrare sciocchi. Quando l'app passa allo sfondo, non si interrompe la riproduzione del video su Apple TV? La ragione che chiedo è che per quanto ne sono consapevole le notifiche e i thread sarebbero fermati su un'app in background. Il motivo è che viene memorizzata un'istantanea, non un'applicazione in esecuzione come si otterrebbe su una macchina desktop. Ciò significa che, anche se un evento viene inviato alla tua app, non avrà alcun effetto in quanto la tua applicazione non sta ascoltando le notifiche. Dovresti annullare la registrazione per le notifiche all'inserimento dello sfondo e quindi inserire nuovamente il registro in primo piano. – Dev2rights

+0

No :) Come ho detto nella domanda, UIBackgroundModes è impostato correttamente e il video continua a funzionare correttamente. Sono solo le notifiche che non sparano. – reddersky