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

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

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

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

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

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

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

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

Update: idea 7, below, as-implemented yields switching times of around 500 ms. This is an improvement, but it it'd be nice to get this even faster.

Idea 1: Use N AVPlayers (won't work)

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

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

Idea 2: Use AVQueuePlayer (won't work)

Я не верю, что пуш 10AVPlayerItems вAVQueuePlayer будет предварительно загружать их все для плавного запуска.AVQueuePlayer это очередь, и я думаю, что она действительно только готовит следующее видео в очереди для немедленного воспроизведения. Я не знаю, какое из 10 видео мы хотим воспроизвести, пока не пришло время его запустить.ИОС-AVPlayer-видео-предзагрузка

Idea 3: Load, Play, and retain AVPlayerItems in background (not 100% sure yet -- but not looking good)

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

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

Idea 4: Use a different file format -- maybe one that is faster to load?

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

Idea 5: Combination of lossless video format + AVQueuePlayer

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

Idea 6: Use a non-standard AVPlayer / write my own / use someone else's

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

Idea 7: Combine everything into a single movie asset, and seekToTime

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос