Обратите внимание на вопрос ниже: все ресурсы локальны на устройстве - потоковая передача по сети не выполняется. Видео содержат звуковые дорожки.
Я работаю над приложением iOS, которое требует воспроизведения видеофайлов с минимальной задержкой для запуска рассматриваемого видеоклипа. К сожалению, мы не знаем, какой именно видеоклип будет следующим, до тех пор, пока нам не понадобится его запустить. В частности: когда воспроизводится один видеоклип, мы будем знать, каков будет следующий набор (примерно) из 10 видеоклипов, но мы не знаем, какой именно, пока не наступит время «немедленно» воспроизвести следующий клип.
Что я сделал, чтобы посмотреть на фактические задержки запуска, так это позвонить addBoundaryTimeObserverForTimes
в видеопроигрыватель с периодом времени в одну миллисекунду, чтобы увидеть, когда видео действительно начало воспроизводиться, и я беру разницу этой отметки времени с первого места в коде, который указывает, какой актив начать воспроизведение.
Из того, что я видел до сих пор, я обнаружил, что использование комбинации AVAsset
загрузки, а затем создания AVPlayerItem
из этого, когда он будет готов, а затем ожидания AVPlayerStatusReadyToPlay
перед вызовом воспроизведения, как правило, занимает от 1 до 3 секунд. чтобы начать клип.
С тех пор я переключился на то, что, на мой взгляд, примерно равноценно: позвонил [AVPlayerItem playerItemWithURL:]
и ждал, пока AVPlayerItemStatusReadyToPlay
сыграет. Примерно такая же производительность.
Я наблюдаю, что первый элемент AVPlayer загружается медленнее, чем остальные. Кажется, одна из идей состоит в том, чтобы предварительно запустить AVPlayer с коротким / пустым активом, прежде чем пытаться воспроизвести первое видео, может быть хорошей общей практикой. [Медленный запуск AVAudioPlayer при первом запуске звук воспроизводится
Я бы хотел максимально сократить время начала видео и иметь некоторые идеи, с которыми можно поэкспериментировать, но хотел бы получить некоторые рекомендации от любого, кто мог бы помочь.
Обновление: приведенная ниже идея 7 в том виде, в котором она реализована, дает время переключения около 500 мс. Это улучшение, но было бы неплохо сделать это еще быстрее.
Идея 1. Используйте N AV-плееров (не сработает)
Используя ~ 10 AVPPlayer
объектов и запустите и приостановите все ~ 10 клипов, и как только мы узнаем, какой из них нам действительно нужен, переключитесь на правильный AVPlayer
, снимите паузу и начните все заново для следующего цикла.
Я не думаю, что это работает, потому что я читал, что в iOS есть примерно 4 активных AVPlayer's
. Кто-то спрашивал об этом здесь в StackOverflow и узнал о пределе 4 AVPlayer: быстро -переключение-видео-использование-avfoundation
Идея 2. Используйте AVQueuePlayer (не работает)
Я не верю, что добавление 10 AVPlayerItems
в AVQueuePlayer
приведет к их предварительной загрузке для беспрепятственного запуска. AVQueuePlayer
- это очередь, и я думаю, что она действительно только делает следующее видео в очереди готовым к немедленному воспроизведению. Я не знаю, какое из ~ 10 видео мы хотим воспроизвести, пока не пришло время начать это. ios-avplayer-video-preloading
Идея 3. Загрузка, воспроизведение и сохранение AVPlayerItems
в фоновом режиме (пока не уверен на 100%, но выглядит не очень хорошо)
Я смотрю, есть ли какие-либо преимущества для загрузки и воспроизведения первой секунды каждого видеоклипа в фоновом режиме (подавление вывода видео и звука) и сохранения ссылки на каждый AVPlayerItem
, и когда мы знаем, какой элемент необходимо воспроизвести на самом деле, поменяйте его местами и поменяйте местами фоновый AVPlayer с активным. Промыть и повторить.
Теоретически можно было бы предположить, что недавно воспроизведенные AVPlayer/AVPlayerItem
могут все еще содержать некоторые подготовленные ресурсы, которые ускорят последующее воспроизведение. До сих пор я не видел пользы от этого, но, возможно, я неправильно настроил AVPlayerLayer
фон. Я сомневаюсь, что это действительно улучшит ситуацию по сравнению с тем, что я видел.
Идея 4. Используйте другой формат файла - может быть, тот, который загружается быстрее?
В настоящее время я использую формат H.264 .m4v (видео-MPEG4). 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-movie-playing-lag-in-ios5
Как вы думаете, какой подход будет лучшим? Пока что я не добился больших успехов в сокращении задержки.
shouldWaitForLoadingOfRequestedResource
для обработки запросов. Проблема в том, что когда я пытаюсь выполнитьseekToTime
для текущего элемента, он не запрашивает соответствующее смещение байта. Он просто запрашивает все видеоданные с самого начала. Плеер меняет состояние наreadyToPlay
, но ждет, пока не загрузятся все данные ... Вы когда-нибудь сталкивались с такой проблемой? - person kokoko   schedule 18.11.2015AVAssetResourceLoaderDelegate
, из которогоshouldWaitForLoadingOfRequestedResource
является методом. Я не использовал этот протокол, поэтому не могу вам в этом помочь, но я думаю, что вопрос в том, что вы на самом деле пытаетесь сделать. Если вы пытаетесь запустить потоковое видео, вам следует посмотреть: developer.apple.com/streaming . Если вы просто пытаетесь загрузить большой файл небольшими порциями, вы можете сделать это полностью безAVAssetResourceLoaderDelegate
. - person Bernie Habermeier   schedule 19.11.2015