Я работаю над приложением, где есть просмотр коллекции, а ячейки представления коллекции могут содержать видео. Прямо сейчас я показываю видео, используя AVPlayer
и AVPlayerLayer
. К сожалению, производительность прокрутки ужасная. Похоже, AVPlayer
, AVPlayerItem
и AVPlayerLayer
делают большую часть своей работы над основной нитью. Они постоянно вынимают замки, ждут семафоров и т. Д., Которые блокируют основную нить и вызывают сильные капли кадров.Поддержание хорошей производительности прокрутки при использовании AVPlayer
Есть ли способ сообщить AVPlayer
, чтобы прекратить делать так много вещей в основной теме? До сих пор ничто из того, что я пробовал, не решило проблему.
Я также попытался создать простой видеоплеер, используя AVSampleBufferDisplayLayer
. Используя это, я могу убедиться, что все происходит с основного потока, и я могу достичь ~ 60 кадров в секунду при прокрутке и воспроизведении видео. К сожалению, этот метод намного ниже, и он не обеспечивает такие функции, как воспроизведение звука и очистка времени из коробки. Есть ли способ получить аналогичную производительность с AVPlayer
? Я бы скорее использовал это.
Edit: Посмотрев на это больше, это не выглядит как это можно добиться хорошей производительности прокрутки при использовании AVPlayer
. Создание AVPlayer
и сопоставление с помощью экземпляра AVPlayerItem
запускает кучу работы, которая батутно по основному потоку, где он затем ждет семафоров и пытается получить кучу замков. Количество времени, которое этот киоск на основной поток увеличивается довольно резко, поскольку количество видеороликов в scrollview увеличивается.
AVPlayer
dealloc также представляется огромной проблемой. Dealloc'ing AVPlayer
также пытается синхронизировать кучу вещей. Опять же, это становится очень плохо, поскольку вы создаете больше игроков.
Это довольно удручающее, и это делает AVPlayer
почти непригодным для использования в том, что я пытаюсь сделать. Блокировка основной нити, подобной этой, является такой любительской штукой, что трудно поверить, что инженеры Apple допустили такую ошибку. В любом случае, надеюсь, они могут исправить это в ближайшее время.
«это не выглядит Как я t можно добиться хорошей производительности прокрутки при использовании AVPlayer « Это просто не так. Существует множество приложений, которые ретранслируют AVFoundation для воспроизведения медиафайлов в прокручиваемых фидах. Vine/Facebook/Instagram используют AVPlayer для воспроизведения медиафайлов в каналах. Это очень сложно, но то, что дамиан, о котором идет речь ниже, является хорошим началом для его продвижения. –
Vine, Facebook и Instagram на самом деле все довольно нестабильно при прокрутке видео. Есть некоторые очень заметные капли для всех из них. Instagram имеет лучшую производительность, но у меня также возникли проблемы с поиском экрана с большим количеством длинных видео высокой четкости в одно и то же время. Похоже, что они также не решили проблему, хотя у них у всех отличные инженеры и тонны ресурсов. Я уверен, что проблема с AVPlayer. Если вы мне не верите, запустите инструменты и посмотрите, как часто основной поток блокируется. – Antonio
Другим хорошим примером является Склад. Это отличное приложение с удивительной прокруткой, и, очевидно, это сделали люди, которые знали, что они делают. Даже еще, создайте статью в хранилище и заполните ее кучей видео и попробуйте прокрутить страницу. Это очень изменчиво. Я уверен, что проблема здесь в AVPlayer. Нет никакого способа заставить его остановить блокировку основного потока. Даже если есть какой-то волшебный способ заставить AVPlayer вести себя, это непростительно плохой дизайн API, поскольку он не должен принимать смехотворные усилия, чтобы получить не ужасную производительность прокрутки. – Antonio