2015-05-20 8 views
8

hat eine Eigenschaft namens rate, die die Wiedergabegeschwindigkeit steuern soll. 1.0 ist normale Geschwindigkeit, während Werte wie 2.0 oder 5.0 mit 2x bzw. 5x wiedergegeben werden sollten.Wie erhalten Sie eine reibungslose High-Rate-Wiedergabe von AVPlayer?

Immer wenn ich einen höheren Wiedergabegeschwindigkeitswert als 1.0 anwende (z. B. 10.0), ist die Wiedergabe sehr abgehackt und es sieht so aus, als würde eine große Anzahl von Bildern fallengelassen, da der Player nicht mithalten kann.

Die gleichen Werte im QuickTime Player (mit demselben Film) erzeugen jedoch eine gleichmäßige Wiedergabe für die Raten 2x, 5x, 10x, 30x and 60x (wie vom QuickTime Player gemeldet).

Ich erstellte eine Test OS X-Anwendung, die nichts mehr als eine AVPlayerView und zwei Tasten zum Einstellen der Wiedergaberate enthält. Eine Rate von 1.0 funktioniert wie erwartet, aber eine Rate von 10.0 erzeugt eine sehr abgehackte Wiedergabe.

jedoch die AVPlayerView eine ungeradee Marotte, dass hat, wenn Sie mit der Maus klicken Sie auf dem Wiedergabe-Timeline an einem anderen Ort zu suchen (während es bei 10-facher und abgehackt spielen), dann die AVPlayerView wird „reparieren“, um die Wiedergabe und den Film wird mit 10x flüssig gespielt. Sie mussten lediglich auf die Wiedergabe-Timeline klicken.

Weiß jemand, wie man reibungslose Wiedergabe für andere Raten als 1x erhält? Es ist offensichtlich kein Hardwareproblem oder ein Problem mit der Dateigröße, da sowohl QuickTime Player als auch AVPlayerView dies können.

Versuche

Diese question legt nahe, dass es möglicherweise eine Audio-Ausgabe (und beide in der Tat Quicktime Player und AVPlayerView Stummschalten des Audio-Signals bei Weiterleitung), aber alle Versuche meinerseits alle entweder deaktivieren Sie alle Audio-Tracks, mute Tracks oder ändern Sie den Tonhöhenalgorithmus schien keinen Unterschied zu machen. Die Wiedergabe war immer noch abgehackt, auch wenn kein Ton vorhanden war.

Ich habe auch versucht, Wiedergabe zu stoppen und dann prerollAtRate:completionHandler mit der neuen Rate aufrufen, aber das macht auch keinen Unterschied.

Was machen QuickTime Player und AVPlayerView, die eine flüssige Filmwiedergabe mit einer Geschwindigkeit von 10x, 30x oder sogar 60x ermöglichen?

+1

Haben Sie eine Lösung für dieses Problem finden? Wenn ja, was war das? –

+0

Nein, tut mir leid. Ich musste meine eigene Lösung erstellen, aber es ist nicht so gut, wie ich es gerne hätte. Langfristig denke ich, dass die beste Wiedergabeerfahrung viel tiefer gehen und die Frame-Decodierung außerhalb von AVPlayer behandeln muss. – kennyc

+0

Unter Macos 10.12.3/Xcode 8.2.1 habe ich einige der oben genannten bestätigt: Geschwindigkeiten bis zu 2.0 zeigt kein Problem, aber das Setzen von 'AVPlayer.rate' auf einen Wert größer als 2.0 verursacht eine abgehackte Wiedergabe; Wenn Sie AVPlayerView verwenden, um die Wiedergaberate zu ändern, erhalten Sie eine flüssige Wiedergabe für alle Geschwindigkeiten. Setzen Sie die Rate zuerst auf 0.0 und rufen Sie dann 'prerollAtRate (atRate :, completionHandler:)' auf und setzen Sie die Rate im Completion-Handler hoch, um das Problem nicht zu lösen. Das Erstellen einer AVMutableComposition mit nur der Videospur löst das Problem nicht; Das Deaktivieren der Audiospur behebt das Problem nicht. – Jamborino

Antwort

0

Dies ist nur eine Problemumgehung.

Wenn die Wiedergaberate von 0,0 auf einen großen Wert geändert wird, ist die Wiedergabe glatt (und der Ton wird automatisch stummgeschaltet), wenn dies der erste Null-zu-Null-Übergang der Wiedergaberate seit dem letzten Aufruf vonist. Es ist notwendig, dass dies der erste solcher Übergang ist: nur die Rate auf 0.0 zuerst einstellen und dann auf die gewünschte Rate funktioniert nicht.

So zum Beispiel wird diese reibungslose Wiedergabe mit hohen Geschwindigkeit erzeugen:

func setPlayerRate(player: AVPlayer, rate: Float) { 
    // AVFoundation wants us to do most things on the main queue. 
    DispatchQueue.main.async { 
     if (rate == player.rate) { 
      return 
     } 
     if (rate > 2.0 || rate < -2.0) { 
      let playerItem = player.currentItem 
      player.replaceCurrentItem(with: nil) 
      player.replaceCurrentItem(with: playerItem) 
      player.rate = rate 
     } else { 
      // No problems "out of the box" with rates in the range [-2.0,2.0]. 
      player.rate = rate 
     } 
    } 
} 
+0

Das Austauschen des AVPlayerItem oder das erneute Timing von Medienspuren in einer AVComposition sind beide gültige, wenn nicht sogar schwerfällige Methoden, um eine reibungslosere Wiedergabe zu erreichen. Sie sind jedoch keine großartigen Lösungen, wenn Sie dem Benutzer erlauben möchten, die Wiedergaberate während der Live-Wiedergabe zu ändern. Ein solches Verhalten ist in Videoanwendungen üblich, die ein "Jog" -Rad haben. Die Introspektion von QuickTime Player schlägt (obwohl nicht bestätigt) vor, dass es bei einigen Wiedergaberaten wiederholte Aufrufe von 'seekTime ... 'macht, wahrscheinlich eine benutzerdefinierte timeBase abknickt und vielleicht einige Decodierungs-/Caching-Tricks für bessere Leistung ausführt. – kennyc

+0

... Und das Ändern der Wiedergabegeschwindigkeit ist in der Tat etwas, was ich gerne tun könnte! Nun, da du es erwähnst, habe ich _also_ ein Ding gebaut, das Filmvorschauen auf die gleiche Weise wie Final Cut Pro X zeigt, wo, während du mit der Maus über ihnen liegst, Zellen in einem Miniaturbild das Video zeigen. Ich habe mich frustriert darüber gefühlt, dass es so gut funktioniert hat, selbst wenn man die Maus herumgeschleudert hat, und das tat es nicht. Ich war einfach nicht schlau genug, um auf diese Weise seekTime anzuwenden. Vielen Dank! Ich werde es versuchen. Das wird auch den Fehler umgehen, dass einige Benachrichtigungen bei der Wiedergabe mit hoher Geschwindigkeit fehlen. – Jamborino

+0

Für ein kleines Video-Thumbnail, durch das der Benutzer scrubben kann, indem Sie einfach die Maus darüber bewegen, erhalten Sie wahrscheinlich mehr als ausreichende Leistung, indem Sie mit der gewünschten Zeit und der zulässigen Toleranz herumspielen. Die Decodierung erfolgt fast augenblicklich, wenn Sie einen "Schlüsselrahmen" anstatt einer beliebigen Zeit suchen. Da die Timing-Genauigkeit in einer Videovorschau nicht wirklich wichtig ist, sollten Sie in Erwägung ziehen, die Zeit, die Sie suchen, so zu massieren, dass sie auf einen Keyframe oder sehr nahe an diesen fällt. Weitere Informationen zur Verwendung von AVSampleCursor zur Identifizierung der Keyframes finden Sie unter TechNote 'TN2404'. – kennyc