Воспроизведение видеоролика h.264 сокетов с потоком в iOS с использованием AVFoundation

Im работает над небольшим iPhone-приложением, которое передает потоковое видео по сетевому соединению с использованием обычных сокетов. Видео находится в формате H.264. Однако у меня возникают трудности с воспроизведением/декодированием данных. Я рассматривал возможность использования FFMPEG, но лицензия делает его непригодным для проекта. Я изучал структуру яблок AVFoundation (в частности, AVPlayer), которая, похоже, способна обрабатывать содержимое h264, однако Im может только найти методы для запуска фильма с использованием URL-адреса - не путем проверки буфера памяти, переданного из сеть.

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

  • Воспроизведение фильма с помощью обычного AVPlayer. Каждый раз, когда данные принимаются в сети, их записывают в файл, используя fopen с append-mode. Ресурс AVPlayer затем перезагружается/воссоздается с обновленными данными. Кажется, есть два вопроса с этим подходом: во-первых, экран становится черным на короткое мгновение, в то время как первый актив выгружается и новый загружается. Во-вторых, я не знаю точно, где игра остановилась, поэтому я не знаю, как я найду подходящее место, чтобы начать играть с новым активом.
  • Второй подход заключается в том, чтобы записать данные в файл, как в первом подходе, но с той разницей, что данные загружаются во второй актив. Затем используется AVQueuedPlayer, когда второй актив вставлен/поставлен в очередь в проигрыватель, а затем вызывается, когда выполняется буферизация. Первый актив может быть выгружен без черного экрана. Однако, используя этот подход, он еще более хлопотно (чем первый подход), чтобы узнать, с чего начать играть новый актив.

Кто-нибудь сделал что-то подобное и заставило его работать? Есть ли способ сделать это с помощью AVFoundation?

Ответ 1

Официальным методом для этого является формат HTTP Live Streaming, который поддерживает несколько уровней качества (среди прочего) и автоматически переключается между ними (например, если пользователь переходит с WiFi на сотовую связь).

Вы можете найти документы здесь: Apple Http Streaming Docs