2013-10-31 7 views
7

sono davvero a corto di idee quindi dovrò chiedere voi ragazzi ancora una volta ...AVPlayer non sincronizzato

Sto costruendo un'applicazione per iPhone che utilizza tre istanze di AVPlayer. Tutti giocano allo stesso tempo ed è molto importante che lo facciano. Ho usato per eseguire questo codice:

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

che ha funzionato perfettamente. Ma pochi giorni fa ha smesso di funzionare, i tre giocatori sono in ritardo di circa 300-400ms (che è molto, tutto sotto 100ms andrebbe bene). Due di questi AVPlayer hanno qualche elaborazione Audio, che richiede un po 'più del normale AVPlayer, ma prima funzionava e la proprietà currentTime mi dice che questi giocatori sono in ritardo, quindi la sincronizzazione sembra fallire.

Non ho idea del motivo per cui ha smesso di funzionare, non ho davvero cambiato qualcosa, ma sto usando un osservatore in cui posso chiedere la proprietà self.playerX.currentTime, che mi dà un ritardo di circa .3- 4 secondi ... Ho già provato a risincronizzare i giocatori se il ritardo> .1f ma il ritardo è ancora lì. Quindi penso che l'elaborazione audio di player1 e 2 non possa essere responsabile del ritardo, poiché la proprietà currentTime sa che sono in ritardo (spero tu sappia cosa intendo). Forse qualcuno di voi ragazzi sa perché sto avendo un ritardo così orribile, o è in grado di darmi un'altra idea.

Grazie in anticipo!

risposta

13

Quindi, ho trovato la soluzione. Ho dimenticato di [self.playerX prerollAtRate:]. Ho pensato che se l'osservatore è AVPlayerReadyToPlay significa che il giocatore è "veramente" pronto. In realtà, non è così. Dopo AVPlayer è pronto per Play, deve essere pre-rollato. Una volta fatto, puoi sincronizzare il tuo inserzionista. Il ritardo è ora da qualche parte a 0.000006 secondi.

+0

Grazie per la condivisione, questa soluzione è stata molto utile. –

+0

Funziona anche con le risorse remote? – zevarito

+0

Grazie Max, puoi modificare la tua risposta per includere il codice originale? Non capisco, è impostato setRate per ogni giocatore nel gestore di completamento di prerollAtRate? –