Die Aufrechterhaltung von guten Blättern Leistung bei der Verwendung von AVPlayer

Arbeite ich an einer Anwendung, wo es eine Auflistung anzeigen, und die Zellen der Sammlung anzeigen kann video. Momentan habe ich die Anzeige des Videos mit AVPlayer und AVPlayerLayer. Leider die Scroll-performance ist schrecklich. Es scheint, wie AVPlayer, AVPlayerItem, und AVPlayerLayer eine Menge tun, Ihre Arbeit auf den Haupt-thread. Sie sind ständig daran, sich sperren, warten auf Semaphore, etc. die Sperrung der main-thread und führt zu schweren Rahmen fällt.

Gibt es eine Möglichkeit zu sagen AVPlayer aufhören, so viele Dinge auf dem Hauptthread? Bisher hab ich nichts versucht, hat das problem gelöst.

Ich habe auch versucht, erstellen einer einfachen video-player mit AVSampleBufferDisplayLayer. Mit diesem kann ich sicherstellen, dass alles, was passiert abseits der Haupt-thread, und ich eine ~60 fps beim scrollen und spielen video. Leider ist diese Methode sehr viel niedrigeren Niveau, und es nicht, Dinge wie audio-Wiedergabe und die Zeit mit dem schrubben aus der box. Gibt es eine Möglichkeit, um ähnliche Leistung mit AVPlayer? Ich würde viel lieber verwenden.

Edit:
Nach einem Blick in diese, mehr, es nicht so Aussehen, wie es möglich ist, zu erreichen, gute scrollen Leistung, wenn AVPlayer. Erstellen einer AVPlayer und den Umgang mit einem AVPlayerItem Instanz startet eine Reihe von arbeiten, die Trampoline auf dem Haupt-thread, wo er dann wartet auf Semaphore und versucht zu erwerben, eine Reihe von sperren. Die Menge der Zeit, diese Stände der Haupt-thread steigert sich dramatisch zu, als die Anzahl der videos in den scrollview erhöht.

AVPlayer dealloc scheint auch ein großes problem. Dealloc ' Ing ein AVPlayer auch zu synchronisieren versucht ein paar Sachen. Wieder, dies wird extrem schlecht, wie man es schaffen mehr Spieler.

Dies ist ziemlich deprimierend und es macht AVPlayer fast unbrauchbar für das, was ich versuche zu tun. Die Sperrung der main-thread wie diesem ist so ein amateur, was zu tun, so ist es schwer zu glauben, dass die Ingenieure von Apple haben, würde diese Art von Fehler. Na ja, hoffentlich können Sie dieses Problem beheben bald.

  • "es sieht nicht wie es möglich ist, zu erreichen, gute scrollen Leistung bei der Verwendung von AVPlayer" das ist einfach nicht der Fall. Es gibt viele apps, die relais auf AVFoundation für die Wiedergabe von Medien in scrolling-feeds. Vine / Facebook / Instagram verwenden alle AVPlayer ist zur Wiedergabe von media-feeds. Seine sehr schwierige, aber was damian unten beschrieben, ist ein guter start für erste Schritte Sie gehen.
  • Vine, Facebook und Instagram sind eigentlich alle ziemlich ruckelig beim scrollen letzten videos. Es gibt einige sehr deutliche frame drops für alle. Instagram hat die beste Leistung, aber ich hatte auch Schwierigkeiten, einen Bildschirm mit vielen langen, high-definition-videos gehen in der gleichen Zeit. Es sieht aus wie Sie haben nicht das problem, entweder, obwohl Sie alle haben großartige Ingenieure und Tonnen von Ressourcen. Ich bin mir ziemlich sicher, dass AVPlayer ist das problem hier. Wenn Sie mir nicht glauben, Feuer, Instrumente und nehmen Sie einen Blick an, wie oft der main-thread blockiert wird.
  • Ein weiteres gutes Beispiel ist der Aufbewahrungsort. Es ist eine tolle app mit erstaunlichen Bildlauf, und offensichtlich war es von Leuten gemacht, die wussten, was Sie Taten. Sogar noch, erstellen Sie ein Lagerhaus Artikel und füllen Sie es mit ein paar videos und versuchen scrollen durch die Seite. Es ist extrem abgehackt. Ich bin mir ziemlich sicher, dass das problem hier ist AVPlayer. Es gibt einfach keinen Weg, um es zu stoppen Blockierung der Haupt-thread. Auch wenn es einige Magische Art und Weise zu bekommen AVPlayer zu Verhalten, dies ist inexcusably schlechte API-design, wie sollte es nicht nehmen eine lächerliche Menge an Aufwand, um nicht schrecklich, scrolling-performance.
  • Ja, kein Zweifel AVFoundation verursachen frame-drops auf der main-thread. Aber Sie können Sie mildern, so gut wie Sie können durch eine Menge von verschiedenen Techniken. Audio ist ein großer hit – Vermeidung audio-Wiedergabe wird helfen, verringern die frame drops. Auch mit scrollen, aggressive controlling von wenn-videos Abspielen / pause ist wichtig. Zum Beispiel, erhalten Sie einen Rahmen trifft, wenn das einreißen ein video, so können Sie vermeiden, dass einige frame-drops von nicht zu stoppen videos, bis Sie ein neues zu beginnen. Anyways, es gibt ein paar Techniken, die angewendet werden können, die außerhalb AVFoundation, die helfen könnte das Problem auch.
  • Hast du keine Lösung gefunden? Ich habe gerade ähnliches Problem bei der Wiedergabe von videos nur im uitableview, nichts von loadValuesAsynchronouslyForKeys zu AVSampleBufferDisplayLayer hilft
  • leider gibt es keine Lösung, werde performant mit AVPlayer. Wie ich bereits in meinem Bearbeiten - Abschnitt, die performance-Probleme sind inhärent in der Umsetzung von AVFoundation, und es gibt nichts, was Sie dagegen tun können. Wenn Sie möchten, um das video abzuspielen, in einigen Sortieren der Ansicht, dass die Schriftrollen, und Sie wollen nicht zu fallen eine Tonne von frames, dann ist die einzige wirkliche Möglichkeit, dies zu tun ist, erstellen Sie Ihre eigenen video-player von Grund auf, unter Umgehung AVPlayer komplett. Oder, Sie können warten, bis iOS 10 und hoffe, dass Apple bekommen haben, seine Tat zusammen dann.
  • Gibt es eine Möglichkeit zu sagen, AVPlayer aufhören, so viele Dinge auf dem Hauptthread? Bisher hab ich nichts versucht, hat das problem gelöst... Erstellen Sie Ihre eigenen dispatch-queues über Ihren eigenen Kontext.
  • Nein, es ist nichts Sie tun können. Egal, was Sie tun, egal, was Thema, das Sie versuchen alles auf, springt es auf den Haupt-thread selbst und ein paar sperren Anrufe. Blick auf alle Apple-apps. Es gibt einen Grund, keiner von Ihnen haben video, das spielt, wie du bist scrollen. Das video wird immer animieren, fullscreen, bevor Sie etwas tut.
  • Sorry, Antonio; du bist falsch. Woher ich das weiß? Weil ich gerade dabei es gestern. Ich kann scrollen sehr glatt bei jeder Geschwindigkeit in einer Auflistung ansehen von videos, spielen auch reibungslos. Es war nicht in der Tat über alle threads. Möchte jemand den code? Ich poste hier in Kürze
  • Ich interessiere mich für die Lösung, hätte gerne einen Blick auf den code. Bitte teilen, wenn Sie nichts dagegen haben.
  • Können Sie downloaden meine-Beispiel-app von meinem blog auf demonicactivity.blogspot.com/2016/08/..., Dass ist ein älteres, das verwendet AVPlayer; ich habe einen code können Sie tauschen, die noch verwendet AVPlayer, aber zum Rendern, OpenGL. Die Grenze ist immer noch 16, aber auch real-time
  • Falsche-a-roony auf diese ein.
  • Erstellen Sie eine Beispiel-app besteht aus einer Tabelle, Ansicht oder Sammlung anzuzeigen, wo jede Zelle in der Liste spielt ein video, das gespeichert wird, entweder lokal in der app-bundle, oder auf einem remote-server, aber NICHT in der Foto-Bibliothek. Stellen Sie sicher, es gibt mindestens 5 - 10 video-Dateien und über 100 Zellen in der Liste. Wenn Sie können reibungslos Blättern Sie durch die Liste der videos bei 60fps und alle videos Abspielen, ich würde lieben zu sehen, dass Antwort und ich bin sicher, dass alle anderen, die von Ihnen positiv bewertet werden, diese Frage würde gerne sehen, dass die Antwort auch.
  • Laden Sie die Beispielanwendung, die Sie beschrieben haben, unter den oben genannten Links. Sie können ein video gibt es auch.
  • Vielen Dank für die Umsetzung der Beispiel-code zusammen. Es ist sehr interessant. Ich habe bemerkt, dass die videos, die ich geladen hat wurden Stottern und spielen in einem inkonsistenten rate, obwohl Haupt-thread Wechselwirkungen waren fast perfekt reagieren. Gibt es irgendwelche Bedenken bei der Notwasserung AVPlayer und synchronisieren von sample-Puffer, richtig?
  • Für was es Wert ist, waren wir in der Lage, gut zu erhalten, erfolgt der Bildlauf durch die a) einen pool von wiederverwendbaren Spieler-und Spieler-Ebenen, b) Erarbeitung Spieler (und Schichten) im Voraus (z.B. +/- 1 Blick vom Bildschirm), und, allem, c) hinzufügen der Spieler layer für die Fenster, versteckt, im Voraus, wie gut. AVPlayerLayer hat eine Menge von internen setup, das wird nicht passieren, bis Sie es können, denkbar, sichtbar sein; das heißt, es existieren in einem Fenster, auch wenn es nur für eine runloop. Dies zu tun, bekommen wir nur sehr wenig Haupt-thread Blockade, wenn Sie schnell hinzufügen/entfernen von Spielern.
  • Ich sollte hinzufügen, dass, in unserem system, wir haben im Grunde eingerichtet, die Spieler und Lagen gut im Voraus. Wir bitten Sie in unserer view-Controller relativ träge (d.h., +/- ein offscreen-view-controller). Schließlich, fügen wir den eigentlichen Spieler-Ebene in der view-Hierarchie und beginnen zu spielen so faul wie möglich (d.h., dem moment, in jedem Teil der view-controller sichtbar ist). Dies war ausreichend für unseren use-case für die AV-Foundation, zu stoppen Blockierung der Haupt-thread der user während der Interaktion.
  • Ich bin mir nicht sicher, ob ich kommentierte diese noch; aber be-sample-Puffer mit einem asset-reader, und anzeigen der sample-Puffer in einem AVSampleBufferDisplayLayer besser funktionieren würde, als wenn mehrere Spieler Objekte. Das ist, weil die sample-Puffer vended in einem separaten thread, und so ist die Core Animation. Dieser Weg dauert das Rätselraten bei der Multithread-Programmierung, und lässt Sie mit einer besser informierten Lösung, als könnten Sie auf Ihre eigenen.
  • hast du irgendeine Lösung dafür ?? Ich sterbe, um zu implementieren eine Ansicht Sammlung von videos, die gezeigt werden können, alle zur gleichen Zeit
  • so haben Sie einen Weg finden, es zu tun?
  • leider habe ich glaube nicht, dass es sowieso eine gute scroll-performance mit AVPlayer, wenn Sie Ihre use-case zeigt videos im inneren der Zellen einer Tabelle, Ansicht oder Sammlung anzuzeigen.
  • Aber wie kommt es, Intagram und andere apps können es tun?
  • Instagram wohl nicht AVPlayer. Sie schrieb Ihre eigenen video-player von Grund auf neu. Die meisten wahrscheinlich, denn Sie rannte in die gleichen Probleme, die seine post bringt.
  • Ja wahrscheinlich, könnten Sie bitte einen Blick auf dieses problem für mich? Dank stackoverflow.com/questions/45777602/...
  • Haben u habe es gelöst? Gibt es eine open-source-player zur Verfügung, die durchführen können diese schweren Aufgaben in der bg?
  • NÖ. Das beste, was Sie tun können, ist schreiben Sie Ihre eigenen video-player mit der video-toolbox-APIs oder so.

InformationsquelleAutor Antonio | 2015-05-21
Schreibe einen Kommentar