2017-08-07 5 views
0

Ich habe zwei AVPlayer() Elemente, die Videos mit der gleichen Dauer abspielen (10 Sekunden). Das Ziel ist es, sie in eine Schleife zu bringen und synchron zu bleiben. Ich füge sie als Unterschichten desselben UIView hinzu und rufe dann player.play() auf jedem von ihnen an.Zwei nicht synchronisierte AVPlayer-Videos (Swift)

Das Problem ist jedoch, dass als Code-Ausführung offensichtlich die geringste Verzögerung hat wie einer nach dem anderen aufgerufen wird, sind die Videos nicht synchron (obwohl nur ein paar Millisekunden, ist es auffällig).

Ich habe nicht die Möglichkeit, eine AVMutableComposition zu erstellen, wie ich andere Beiträge suggeriert habe. Gibt es also trotzdem zwei separate Player, die wirklich synchron bleiben und gleichzeitig GENAU spielen?

Vielen Dank!

+0

Mögliche Duplikat von [Wie iOS Methodenaufruf an genauen Zeitpunkt planen] (https : //stackoverflow.com/questions/22866066/how-to-schedule-ios-method-call-at-exact-time) – the4kman

+0

nach meinem Verständnis, erstellen Sie zwei Ansichten mit jeweils Klassen mit avplayer implementiert mit functionToPlayVideo in beiden Klassen. Fügen Sie beide Ansichten zu Ihrem Viewcontroller hinzu, den Sie verwenden. Fügen Sie nun in beiden Ansichtsklassen einen Observer hinzu, der den Selektor "functionToPlayVideo" enthält. Jetzt sollte die Benachrichtigung funktionieren. –

+0

@AadilAli Sehr interessante Idee in der Tat. Ich habe nie daran gedacht, die Benachrichtigungs-Listener auf diese Weise zu verwenden. Ich werde es versuchen. – simplexity

Antwort

2

Wenn Sie die Synchronisierung erreichen möchten, sollten Sie die Videos separat mit AVPlayer laden und die AVPlayerItemStatus Eigenschaft jedes Players beobachten. Nur wenn alle Spieler den Status .readyToPlay haben, können Sie die Spieler durchlaufen und die Eigenschaft .rate festlegen.

Edit:

Sie können sie auch durch setRate(_:time:atHostTime:) mit synchronisieren. Vergessen Sie nicht, vor dem Aufruf von setRate Mediendaten unter Verwendung von preroll(atRate:completionHandler:) zu laden. Grundsätzlich gilt:

  • warten readyToPlay
  • preroll(atRate:completionHandler:), wenn alle Spieler bereit sind,
  • setRate(_:time:atHostTime:), wenn alle Spieler vorgerollt wurden
+0

also, wenn ich die Spieler durchlaufe und die Raten einstelle, solange das .readytoplay gut ist, würde es nicht dieselbe synchrone Verarbeitungsverzögerung haben? – simplexity

+0

@Simplexity Ich habe gerade meine Antwort bearbeitet –