2013-10-31 16 views
7

naprawdę mi się pomysły więc muszę prosić was znowu ...AVPlayer nie zsynchronizowane

buduję aplikacji iPhone, które wykorzystuje trzy instancje AVPlayer. Wszystkie grają w tym samym czasie i bardzo ważne jest, aby to robili. Zwykłem uruchamiać ten kod:

CMClockRef syncTime = CMClockGetHostTimeClock(); 
CMTime hostTime = CMClockGetTime(hostTime); 
[self.playerOne setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 
[self.playerTwo setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 
[self.playerThree setRate:1.0f time:kCMTimeInvalid atHostTime:hostTime]; 

który działał idealnie. Ale kilka dni temu po prostu przestało działać, trzej gracze są opóźnieni o około 300-400ms (co jest dużo, wszystko poniżej 100ms byłoby w porządku). Dwa z tych odtwarzaczy AVP mają trochę przetwarzania dźwięku, co zajmuje trochę więcej czasu niż "normalny" odtwarzacz AVPlayer, ale wcześniej działało, a właściwość currentTime mówi mi, że ci gracze są opóźnieni, więc synchronizacja wydaje się nie udać.

Nie mam pojęcia, dlaczego to przestało działać, tak naprawdę nic nie zmieniłem, ale używam obserwatora, w którym mogę zadać właściwość self.playerX.currentTime, co daje mi opóźnienie około .3- .4 sekundy ... Próbowałem już zsynchronizować graczy, jeśli opóźnienie wynosi> .1f, ale opóźnienie nadal istnieje. Myślę więc, że przetwarzanie dźwięku odtwarzacza 1 i 2 nie może być odpowiedzialne za opóźnienie, ponieważ właściwość currentTime wie, że są opóźnione (mam nadzieję, że wiesz o co mi chodzi). Może ktoś z was wie, dlaczego mam tak straszne opóźnienie, lub jest w stanie podać mi inny pomysł.

Z góry dziękuję!

Odpowiedz

13

Więc znalazłem rozwiązanie. Zapomniałem [self.playerX prerollAtRate:]. Pomyślałem, że jeśli obserwatorem jest AVPlayerReadyToPlay, oznacza to, że gracz jest "naprawdę" gotowy. W rzeczywistości tak nie jest. Po tym, jak AVPlayer jest gotowy do gry, musi być wstępnie zwinięty. Gdy to zrobisz, możesz zsynchronizować placer. Opóźnienie wynosi teraz 0,000006 sekund.

+0

Dzięki za udostępnienie, to rozwiązanie było bardzo pomocne. –

+0

Czy to też działa z zasobami zdalnymi? – zevarito

+0

Dzięki Max, możesz edytować swoją odpowiedź, aby dołączyć oryginalny kod? Nie rozumiem, czy setRate wymaga od każdego gracza w module obsługi zakończenia prerollAtRate? –