Загрузка AVPlayer и прогрессивного видео с помощью AVURLAssets

У нас есть приложение, над которым мы работаем, чтобы обеспечить воспроизведение видеофайлов через AVPlayer. Файлы должны храниться на пользовательском устройстве, но также должны воспроизводиться при загрузке.

В настоящий момент мы создали модуль загрузки, в котором используется библиотека ASIHTTPRequest, чтобы получить видеофайлы через PHP (мы не знаем, t нужно, чтобы носители связывались через общедоступные URL-адреса) и записывайте их на диск асинхронно.

Затем мы установили AVPlayer в соответствии с Руководство по программированию AV Foundation, получив файл с AVURLAsset, создав AVPlayerItem с активом, создавая AVPlayer с помощью элемента, а затем устанавливая плеер на AVPlayerLayer. Плеер отлично работает с полностью загруженным видеофайлом, а также отлично воспроизводит загруженный файл в симуляторе.

К сожалению, на самом устройстве поведение игрока меняется, и вместо этого он, похоже, загружает видео один раз и не пытается захватить новые пакеты с диска. В результате игрок будет воспроизводить видео и аудио до точки в видео, которая отмечает, где был загружен процесс загрузки во время загрузки актива (например, если 2 МБ данных буферизованы, то игрок создан, игрок будет только играйте с данными на 2 МБ). Поскольку у него есть видео-заголовок, плеер с удовольствием продолжит думать о том, что он играет на всю длительность видео, но никакое другое видео не отображается на экране.

Последняя морщина заключается в том, что если видео вставляется в AVComposition и AVPlayer создается с этим, прогрессивное видео будет воспроизводиться нормально. Это было бы прекрасным решением (и это необходимо для нашего приложения в любом случае по случаю), за исключением того, что клиент для нашего приложения требует, чтобы видео можно было воспроизводить на Apple TV через AirPlay, которые AVCompositions неспособны.

Кто-нибудь знает, есть ли способ постепенно воспроизводить видеофайлы с помощью AVPlayer, созданного из AVURLAssets? Есть ли способ заставить плеер /playerItem читать с диска с помощью AVURLAsset это похоже на AVComposition вместо того, чтобы, по-видимому, кэшировать видео в памяти?

Спасибо!

Ответ 1

У меня нет решения просто заставить его работать с AVURLAssets, но я использую несколько иной подход. Мы связываем наше приложение с CocoaHTTPServer и воспроизводим видеофайлы, которые не загружаются полностью через HTTP-запрос на локальный сервер.

Сервер знает общую длину файла и затем может решить, просматривая HTTP-заголовки, какая часть файла является запросом, и либо загружает ее с диска, либо из удаленного источника.

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

Вам понадобится подкласс HTTPConnection и создать собственный класс HTTPResponse, посмотрев предоставленный "HTTPAsyncFileResponse".

Надеюсь, это даст вам представление о том, как это сделать с другим подходом.