Как уменьшить задержку запуска iOS AVPlayer

Обратите внимание, что для приведенного ниже вопроса :Все активы являются локальными на устройстве --потоковая передача по сети не выполняется. Видео содержат звуковые дорожки.

Я работаю над приложением для iOS, которое требует воспроизведения видеофайлов с минимальной задержкой для запуска рассматриваемого видеоклипа. К сожалению, мы не знаем, какой именно видеоклип будет следующим, пока нам не понадобится его запустить. В частности, :Когда воспроизводится один видеоклип, мы будем знать, какой будет следующий набор из (примерно )10 видеоклипов, но мы не знаем, какой именно, пока не придет время «немедленно» воспроизвести следующий клип.

Что я сделал, чтобы посмотреть на фактические задержки запуска, так это вызвал addBoundaryTimeObserverForTimesна видеоплеере с периодом времени в одну миллисекунду, чтобы увидеть, когда видео действительно начало воспроизводиться, и я беру разницу в этой метке времени с помощью первое место в коде, указывающее, с какого актива начинать играть.

Из того, что я видел до сих пор -далеко,Я обнаружил, что использование комбинации загрузки AVAssetи последующего создания AVPlayerItemиз этого, как только он будет готов, а затем ожидания AVPlayerStatusReadyToPlayперед тем, как я вызову воспроизведение, обычно занимает от 1 до 3 секунд для запуска клипа..

С тех пор я переключился на то, что, по моему мнению, примерно эквивалентно :вызову [AVPlayerItem playerItemWithURL:]и ожиданию воспроизведения AVPlayerItemStatusReadyToPlay. Примерно такая же производительность.

Одна вещь, которую я наблюдаю, это то, что загрузка первого элемента AVPlayer происходит медленнее, чем остальные. Кажется, одна из идей состоит в том, чтобы предварительно -запустить AVPlayer с коротким/пустым активом, прежде чем пытаться воспроизвести первое видео, что может быть хорошей общей практикой. [ Медленный запуск AVAudioPlayer при первом воспроизведении звука

Я хотел бы максимально сократить время начала видео и иметь некоторые идеи, с которыми можно поэкспериментировать, но мне хотелось бы получить рекомендации от любого, кто мог бы помочь.

Обновление :идеи 7, приведенной ниже, по мере реализации -дает время переключения около 500 мс. Это улучшение, но было бы неплохо сделать это еще быстрее.

Идея 1 :Использовать N AVPlayers (не получится)

Используя ~10 AVPPlayerобъектов и запустив -и -, приостановите все ~10 клипов, и как только мы узнаем, какой из них нам действительно нужен, переключитесь на -и снимите -паузу с правильным AVPlayer, и начать все сначала для следующего цикла.

Я не думаю, что это работает, потому что я читал, что в iOS существует примерно 4 активных AVPlayer's. Кто-то спрашивал об этом на StackOverflow здесь и узнал об ограничении в 4 AVPlayer :. быстрое -переключение -между -видео -с помощью -avfoundation

Идея 2 :Использовать AVQueuePlayer (не получится)

Я не верю, что добавление 10 AVPlayerItemsв AVQueuePlayerпредварительно -загрузит их все для плавного запуска. AVQueuePlayer— это очередь, и я думаю, что она делает следующее видео в очереди готовым к немедленному воспроизведению.Я не знаю, какое из ~10 видео мы хотим воспроизвести, пока не пришло время начать это. ios -avplayer -видео -предварительная загрузка

Идея 3 :Загрузить, воспроизвести и сохранить AVPlayerItemsв фоновом режиме (пока не уверен на 100% --, но выглядит не очень хорошо)

Я смотрю, есть ли какая-либо польза от загрузки и воспроизведения первой секунды каждого видеоклипа в фоновом режиме (, подавления вывода видео и звука )и сохранения ссылки на каждый AVPlayerItem, и когда мы знаем какой элемент нужно воспроизвести по-настоящему, замените его и замените фоновый AVPlayer активным. Промыть и повторить.

Теория заключается в том, что недавно воспроизведенные AVPlayer/AVPlayerItemмогут по-прежнему содержать некоторые подготовленные ресурсы, которые ускорят последующее воспроизведение. До сих пор я не видел преимуществ от этого, но у меня может быть неправильная настройка AVPlayerLayerдля фона. Я сомневаюсь, что это действительно улучшит ситуацию по сравнению с тем, что я видел.

Идея 4 :Используйте другой формат файла --может быть тот, который быстрее загружается?

В настоящее время я использую формат.m4v (видео -MPEG4 )H.264. H.264 имеет множество различных вариантов кодека, поэтому возможно, что некоторые параметры ищутся быстрее, чем другие. Я обнаружил, что использование более продвинутых настроек, которые уменьшают размер файла, увеличивает время поиска, но не нашел никаких других вариантов.

Идея 5 :Комбинация формата видео без потерь + AVQueuePlayer

Если есть формат видео, который быстро загружается, но, возможно, имеет безумный размер файла, одна из идей может состоять в том, чтобы предварительно -подготовить первые 10 секунд каждого видеоклипа с версией, которая раздута, но быстрее загружается, но подкрепите это активом, закодированным в H.264. Используйте AVQueuePlayer и добавьте первые 10 секунд в формате несжатого файла, а затем добавьте файл в формате H.264, который получает до 10 секунд времени подготовки/предварительной загрузки.Таким образом, я получаю «лучшее» из обоих миров :быстрое время запуска, но также выигрываю от более компактного формата.

Идея 6 :Использовать не -стандартный AVPlayer / написать свой / использовать чужой

Учитывая мои потребности, возможно, я не могу использовать AVPlayer, но должен прибегнуть к AVAssetReader и декодировать первые несколько секунд (, возможно, записать необработанный файл на диск ), а когда дело доходит до воспроизведения, использовать необработанный формат для быстрого воспроизведения. Мне кажется, что это огромный проект, и если я буду делать это наивно, это неясно / вряд ли даже сработает лучше. Каждый декодированный и несжатый видеокадр весит 2,25 МБ. Наивно говоря --, если мы выберем ~30 кадров в секунду для видео, я получу ~60 МБ/с при чтении -с -требований к диску, что, вероятно, невозможно / подтолкнуть его. Очевидно, нам нужно было бы сделать некоторый уровень сжатия изображений (, возможно, собственные форматы сжатия openGL/es через PVRTC )... но это какое-то сумасшествие. Может быть, есть библиотека, которую я могу использовать?

Идея 7 :Объединить все в один ресурс фильма и seekToTime

Одна идея, которая может быть проще, чем некоторые из вышеперечисленных, состоит в том, чтобы объединить все в один фильм и использовать seekToTime. Дело в том, что мы будем прыгать повсюду. По сути, случайный доступ к фильму. Я думаю, что это действительно может сработать:avplayer -фильм -воспроизведение -отставание -в -ios5

Как вы думаете, какой подход был бы лучшим? До сих пор я не добился большого прогресса в плане уменьшения отставания.

110
задан Community 23 May 2017 в 11:54
поделиться