2012-01-31 15 views
6

Mam aplikację, która przesyła wideo z sieci i odtwarza je przy użyciu obiektu MPMoviePlayerController do odtwarzania na urządzeniu lub za pośrednictwem AirPlay.Reagowanie na powiadomienia MPMoviePlayerController podczas odtwarzania w tle multimediów

Aplikacja obsługuje operacje w tle i ma opcję "audio" wymienioną w wymaganym kluczu UIBackgroundModes w swoim pliku plist.

Podczas odtwarzania w trybie AirPlay można z powodzeniem przesuwać aplikację w tło, a wideo jest nadal odtwarzane poprawnie. Jak na razie dobrze.

Według Apple documentation:

tym kluczu dźwięku mówi ram systemowych, które powinny kontynuować gry i wprowadzić niezbędne zwrotnych do aplikacji na odpowiednich odstępach czasu. Jeśli aplikacja nie zawiera tego klucza, dźwięk odtwarzany przez aplikację zatrzymuje się, gdy aplikacja przenosi się na tło.

Jednak te wywołania zwrotne nie są wykonywane.

Aplikacja wykorzystuje dwa typy wywołań zwrotnych: związane z powiadomieniami MPMoviePlayerController i AVPlayer wysyłane podczas odtwarzania wraz z oddzwanianiem opartym na zegarze, które monitorują pozycję odtwarzania i statystyki wydajności dla celów monitorowania.

Patrząc na notatki Apple, z pewnością spodziewałbym się otrzymać pierwszy typ wywołania zwrotnego, aby aplikacja mogła odpowiedzieć na MPMoviePlayerPlaybackStateDidChangeNotification, MPMoviePlayerPlaybackDidFinishNotification i MPMoviePlayerLoadStateDidChangeNotification, ale tak się nie stanie.

Czy ktoś wie, czy można je odbierać podczas odtwarzania w tle AirPlay, a jeśli tak, to w jaki sposób został osiągnięty?

** Uwaga: aplikacja działa poprawnie podczas pracy na pierwszym planie i otrzymuje mandat za powiadomienie. Dopiero gdy są wypychane na drugi plan i odtwarzane przez AirPlay, powiadomienia nie są odbierane.

Podobnie, wideo odtwarzane jest prawidłowo w tle w trybie AirPlay. Tylko powiadomienia nie są odbierane **

Odpowiedz

0

Dla kompletności, powinienem dodać, że obecnie uważam, że nie ma rozwiązania tego problemu.

Omówiłem to bezpośrednio z Apple za pośrednictwem pomocy technicznej i nie było praktycznego obejścia.

Ta funkcja była niezbędna, aby umożliwić aplikacji rejestrowanie statystyk dotyczących odtwarzania strumienia w regularnych odstępach czasu. Chociaż jest to w porządku, gdy wideo jest odtwarzane na ekranie urządzenia oraz w trybie AirPlay, gdy aplikacja jest na pierwszym planie, nie można tego zrobić z aplikacją w tle.

Rozwiązanie Poszedłem ze zamiast jest wyłączyć licznik bezczynności podczas wszystkich typów odtwarzania i ponownie włączyć później przy użyciu:

[UIApplication sharedApplication].idleTimerDisabled = YES; 

i

[UIApplication sharedApplication].idleTimerDisabled = NO; 

Chociaż nie jest rozwiązaniem pierwotnego pytania, jest sposobem na uniknięcie problemu w pierwszej kolejności.

2

W jednym z moich projektów zrobiłem to, co zrobiłeś i zadziałało to dla mnie. dwie różnice w moim projekcie:

  • ja nie strumieniowe poprzez AirPlay (tylko odtwarzanie device),
  • Ja tylko odtwarzanie plików audio.

Mój krok po kroku:

  • dodać opcję audio UIBackgroundModes w pliku plist,
  • Rejestracja do NotificationCenter dla MPMoviePlayerPlaybackDidFinishNotification i MPMoviePlayerPlaybackStateDidChangeNotification z następującego kodu:

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

Działa jak urok.

+0

Tak, odtwarzanie dźwięku za pośrednictwem urządzenia działa dobrze. Niestety, potrzebuję AirPlay i wideo, obawiam się. – reddersky

+0

@virorum Jeśli usuniesz funkcję airplay z równania, czy wywołania zwrotne zostaną wywołane? Jeśli tak, to brzmi jak błąd Apple. Inaczej może mmich będzie na tyle uprzejmy, aby udostępnić swój kod;) – Danra

+0

Połączenia są nawiązywane, gdy są na pierwszym planie. Jedynie podczas grania w AirPlay w tle nie działają. Myślę, że może to być jednak sprawa z Apple. – reddersky

4

Miałem ten problem i naprawiłem go, ale to było kilka miesięcy temu. Mogłabym wysłać całą moją klasę do odtwarzania filmów, jeśli to nie zadziała. Pamiętaj, że używa on modelu kontrolera nawigacyjnego.

UWAGA: Testowany jest na iPadzie 2, a nie na iPhonie.

pokażę mój VC tak:

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

Wtedy w mojej klasie MovieVC widok kontrolera i ustawić odtwarzanie wideo tak:

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

to naprawić to dla mnie, jeśli nie robi "Napraw komentarz i źle edytuj z całym plikiem klasy.

+0

Tak, to poprawnie pobiera powiadomienia, gdy aplikacja jest na pierwszym planie, ale nie wtedy, gdy została przeniesiona na miejsce z aplikacją wielozadaniową. – reddersky

+0

@virorum: ok na ryzyko brzmi głupio. Gdy aplikacja wejdzie w tło, czy odtwarzanie wideo na Apple TV nie zostanie zatrzymane? Powodem, o który pytam, jest to, o ile wiem, powiadomienia i wątki będą zatrzymywane w aplikacji w tle. Powodem jest to, że przechowywana jest migawka, a nie działająca aplikacja, jak na komputerze stacjonarnym. Oznacza to, że nawet jeśli zdarzenie zostanie wysłane do Twojej aplikacji, nie będzie to miało żadnego efektu, ponieważ aplikacja nie będzie nasłuchiwała powiadomień. Powinieneś wyrejestrować się z powiadomień po wprowadzeniu tła, a następnie ponownie przy wpisywaniu rejestru pierwszego planu. – Dev2rights

+0

Nie :) Jak już wspomniałem w pytaniu, UIBackgroundModes jest ustawione poprawnie, a wideo nadal jest odtwarzane poprawnie. To tylko powiadomienia, które nie wystrzeliwują. – reddersky

Powiązane problemy