2013-10-31 14 views
7

Ich bin wirklich aus Ideen, damit ich euch werden muß, um wieder fragen ...AVPlayer nicht synchronisiert

ich eine iPhone-Anwendung baute die drei Instanzen von AVPlayer verwendet. Sie spielen alle gleichzeitig und es ist sehr wichtig, dass sie das tun. Ich habe diesen Code ausgeführt:

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

was perfekt funktioniert. Aber vor ein paar Tagen hat es einfach aufgehört zu arbeiten, die drei Spieler sind um 300-400ms verzögert (was viel zu viel ist, alles unter 100ms wäre in Ordnung). Zwei dieser AVPlayer haben einige Audio-Verarbeitungen, die etwas länger dauern als der "normale" AVPlayer, aber früher hat es funktioniert und die currentTime -Eigenschaft sagt mir, dass diese Player verzögert sind, daher scheint die Synchronisation fehlzuschlagen.

Ich habe keine Ahnung, warum es aufgehört hat zu arbeiten, ich habe nicht wirklich etwas geändert, aber ich benutze einen Beobachter, wo ich die self.playerX.currentTime-Eigenschaft fragen kann, was mir eine Verzögerung von etwa .3- .4 Sekunden ... Ich habe bereits versucht, die Player neu zu synchronisieren, wenn die Verzögerung> .1f, aber die Verzögerung ist immer noch da. Also denke ich, dass die Audioverarbeitung von player1 und 2 nicht für die Verzögerung verantwortlich sein kann, da die currentTime -Eigenschaft weiß, dass sie verzögert sind (ich hoffe du weißt, was ich meine). Vielleicht weiß jemand von euch, warum ich so eine schreckliche Verzögerung habe oder mir eine andere Idee geben kann.

Vielen Dank im Voraus!

Antwort

13

Also habe ich die Lösung gefunden. Ich habe [self.playerX prerollAtRate:] vergessen. Ich dachte, wenn der Beobachter AVPlayerReadyToPlay ist, bedeutet das, dass der Spieler "wirklich" bereit ist. Tatsächlich tut es das nicht. Nachdem der AVPlayer readyToPlay ist, muss er vorgerollt werden. Sobald dies erledigt ist, können Sie Ihren Platzierer synchronisieren. Die Verzögerung liegt jetzt irgendwo bei 0,000006 Sekunden.

+0

Danke für den Austausch, diese Lösung war sehr hilfreich. –

+0

Funktioniert das auch mit Remote-Assets? – zevarito

+0

Danke Max, kannst du deine Antwort so bearbeiten, dass sie den Originalcode enthält? Ich verstehe nicht, wird setRate für jeden Spieler im Completion-Handler von prerollAtRate aufgerufen? –