2012-11-21 7 views
8

Mam odtwarzacz strumieniowego przesyłania danych oparty na AVQueuePlayer, który musi działać w tle. Gracz musi kontynuować grę, dopóki nie zakończy odtwarzania całej listy. Oczywiście będzie musiał przerwać, jeśli połączenie sieciowe stanie się złe, ale powinno zostać automatycznie wznowione po powrocie połączenia sieciowego.Jak uzyskać połączenie zwrotne z AVQueuePlayer/AVPlayerItem, gdy sieć staje się aktywna (i jest gotowa do odtwarzania)?

Do tego mam monitorowania

  • AVPlayerItem.status
  • AVPlayerItem.playbackLikelyToKeepUp
  • AVPlayer.currentItem
  • AVPlayer.status
  • AVPlayer.error

używając KV O. Jeśli na przykład odzyskasz połączenie sieciowe z tymczasowego błędu, oczekuję, że currentAVPlayerItem.status stanie się , który zostanie zgłoszony mojemu odtwarzaczowi i będę mógł wydać w tym momencie [AVQueuePlayer play].

Ten mechanizm (logika) wydaje się działać niektóre przypadki, ale dość często w trybie offline środowiska, AVPlayerItem.status staje AVPlayerItemStatusFailed, który element AVQueuePlayer wydaje się automatycznie pominąć. W rezultacie kolejka będzie pusta i nie będzie można odebrać wywołania zwrotnego od AVPlayerItem.

miałem nadzieję, że niektóre nieruchomości w AVPlayer zmieni, gdy połączenie sieciowe psuje/odzyskuje, ale nic nie wydaje się zmieniać (status, error etc).

Oczywiście mogę monitorować Reachability, ale to nie działa, gdy aplikacja działa w tle.

Skąd mam wiedzieć, kiedy sieć się zwróci i AVQueuePlayer będzie można odtworzyć w tej sytuacji?

Mogę być po prostu nowicjuszem w tym obszarze. Jeśli ktokolwiek może mi dać ogólny pogląd na to, jak on/ona osiąga nieprzerwane doświadczenie gry, nie będąc całkowicie zatrzymanym przez tymczasowe problemy z połączeniem z siecią, będzie to również niesamowita pomoc!

+0

Mając ten sam problem. Czy znalazłeś jakieś rozwiązanie? – adamsfamily

Odpowiedz

0

Można monitorować AVPlayerItemPlaybackStalledNotification wiedzieć, kiedy pozycja zakończeniu odtwarzania bufora, ale nie cały plik:

[[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(AVPlayerItemPlaybackStalledNotification:)             
     name:AVPlayerItemPlaybackStalledNotification object:playerItem]; 

Gdy nie wystarczy bufor, aby kontynuować, powinieneś dostać powiadomienie wysłane do playbackLikelyToKeepUp który brzmi to jak ty "już monitoruję.

Powiązane problemy