Обратите внимание, что для приведенного ниже вопроса :Все активы являются локальными на устройстве --потоковая передача по сети не выполняется. Видео содержат звуковые дорожки.
Я работаю над приложением для 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
Как вы думаете, какой подход был бы лучшим? До сих пор я не добился большого прогресса в плане уменьшения отставания.