Реалізація HLS-стримінгу з мобільного пристрою: iOS та Android

HLS-стримінг з мобільного — задача нетривіальна. Телефон виступає джерелом: записує відео сегментами, завантажує їх на HTTP-сервер та оновлює m3u8-плейлист. На відміну від відтворення HLS, тут важливо забезпечити стабільний захват, швидке пакування в TS та надійне завантаження. Ми реалізуємо такі пр

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Реалізація HLS-стримінгу з мобільного пристрою: iOS та Android
Складний
від 1 тижня до 3 місяців

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    896
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

HLS-стримінг з мобільного — задача нетривіальна. Телефон виступає джерелом: записує відео сегментами, завантажує їх на HTTP-сервер та оновлює m3u8-плейлист. На відміну від відтворення HLS, тут важливо забезпечити стабільний захват, швидке пакування в TS та надійне завантаження. Ми реалізуємо такі проекти під ключ: від вибору протоколу до інтеграції з CDN. Нижче розберемо технічні деталі.

Як працює HLS-push з пристрою

Класична схема: телефон → HTTP PUT/POST TS-сегментів + оновлення .m3u8 → origin HTTP сервер → CDN → глядачі. Альтернатива: телефон → RTMP → медіасервер → HLS для глядачів (тоді HLS генерує сервер, не телефон). Прямий HLS-push підтримують: Apple Media Stream Segmenter (тільки macOS), CloudFront з WebDAV, Akamai Media Services, а також власний nginx з ngx_http_dav_module. Ми віддаємо перевагу настроюваному origin-серверу, оскільки це дає повний контроль над затримкою та форматом сегментів.

Порівняння підходів на iOS та Android

Платформа Інструмент Кодувальник Формат сегментів Надійність Затримка
iOS FFmpegKit (h264_videotoolbox) Апаратний H.264 MPEG-TS Висока 6–30 с (стандарт) / 2–4 с (LL-HLS через сервер)
iOS Кастомний TS-сегментер Апаратний H.264 MPEG-TS (ручна PES/PMT) Середня (помилки пакування) Аналогічно
Android FFmpegKit (h264_mediacodec) Апаратний H.264 MPEG-TS або fMP4 Висока 6–30 с
Android MediaMuxer з fMP4 Апаратний H.264 fMP4 (HLS v7+) Низька (нестандартно) Вище через буферизацію

Чому варто обирати прямий HLS-push замість RTMP?

RTMP — протокол з постійним з'єднанням, що потребує сервера-ретранслятора (наприклад, Nginx-RTMP). Це додає ланку та збільшує затримку. Прямий HLS-push працює поверх HTTP, що дозволяє безпосередньо відправляти сегменти в CDN (Akamai, CloudFront). Мінус — потрібен розумніший клієнтський код для пакування в TS та завантаження. Наш досвід показує: для live-стримів з аудиторією до 10 000 глядачів HLS-push працює стабільніше та дешевше, ніж RTMP+CDN. Економія на інфраструктурі може сягати 30–40%.

Як реалізувати HLS-стримінг на iOS?

На iOS немає вбудованого HLS-енкодера для live — тільки AVAssetExportSession для файлів. Для live HLS будуємо pipeline вручну:

AVCaptureSession → AVCaptureVideoDataOutput → VideoToolbox (encode H.264) → накопичуємо NAL units в TS-сегменти по 2-4 секунди → URLSession.uploadTask на сервер → оновлюємо m3u8 маніфест 

Збірка MPEG-TS з NAL units — ручне пакування PES пакетів з PAT/PMT таблицями. Готової бібліотеки на Swift немає. Тому на практиці використовуємо FFmpegKit:

-f avfoundation -i 0:0 -c:v h264_videotoolbox -b:v 2M -hls_time 2 -hls_list_size 5 -hls_flags delete_segments -method PUT http://origin/stream/index.m3u8 

h264_videotoolbox — апаратний кодувальник. Флаг -method PUT завантажує сегменти та плейлист на сервер. Працює, навантаження на CPU помірне.

Що таке Low-Latency HLS і коли він потрібен?

Стандартний HLS — затримка 6–30 секунд. LL-HLS знижує до 2–4 секунд за рахунок EXT-X-PART директив (представлено Apple на WWDC). З мобільного пристрою генерувати LL-HLS частини (тривалістю 0.2–0.5 с) надзвичайно складно без спеціалізованого енкодера. Практичніше: пристрій пушить RTMP з малим буфером, медіасервер (Nimble Streamer, Wowza) з LL-HLS плагіном генерує потік для глядачів. Це перевірене рішення, яке ми рекомендуємо, якщо затримка критична.

Порівняння схем: прямий HLS-push vs RTMP+сервер

Критерій Прямий HLS-push RTMP + медіасервер
Затримка 6–30 с (стандарт) 8–35 с (з урахуванням ретрансляції)
Інфраструктура Origin HTTP сервер RTMP-сервер (Nginx-RTMP, Wowza)
Складність клієнта Висока (сегментування) Середня (RTMP-пушинг)
CDN-інтеграція Напряму (PUT-запити) Через сервер-ретранслятор
Стійкість до збоїв Висока (HTTP простіше кешувати) Середня (RTMP-з'єднання повинно бути постійним)

Що входить в реалізацію HLS-стримінгу під ключ

  • Аналіз вимог: бітрейт, роздільна здатність, цільова аудиторія, CDN.
  • Вибір схеми: прямий HLS-push або RTMP → сервер.
  • Розробка клієнтського додатку: iOS (Swift + FFmpegKit) або Android (Kotlin + FFmpegKit).
  • Налаштування origin-сервера: nginx з DAV-модулем або сторонній CDN (Akamai, CloudFront).
  • Тестування: навантажувальне, перевірка затримки, стабільності при слабкому сигналі.
  • Документація та навчання: опис інтеграції, налаштування provisioning profile для сповіщень (push) та фонових завдань.

Apple HLS Authoring Specification

Докладніше про налаштування origin-сервераДля організації origin-сервера часто використовуємо nginx з модулем ngx_http_dav_module. Конфігурація дозволяє приймати PUT-запити від пристрою та роздавати TS-сегменти і m3u8-плейлист. Приклад блоку location: /stream { dav_methods PUT; dav_access user:rw group:rw; }

Процес роботи

  1. Аналітика: визначаємо протокол, необхідну затримку, ємність сховища на сервері.
  2. Проектування: схема pipeline (захоплення → кодування → сегментування → завантаження → маніфест).
  3. Реалізація: пишемо код на Swift/Kotlin, інтегруємо FFmpegKit.
  4. Тестування: на реальних пристроях (iPhone 12, Pixel 6) з різними бітрейтами та мережами.
  5. Деплой: викладка в App Store / Google Play, налаштування сервера, моніторинг.

Строки орієнтовно

Реалізація через FFmpegKit з завантаженням на origin — від 2 до 3 днів. Кастомний TS-сегментер та LL-HLS — від 1 до 2 тижнів. Точні строки залежать від складності інтеграції (кількість бітрейтів, підтримка фонового стримінгу).

Типові помилки та як їх уникнути

  • Ігнорування Push Notifications: для HLS-push в фоні потрібно правильно налаштувати Background Modes (iOS) та Foreground Service (Android).
  • Неправильний таймінг сегментів: сегменти більше 6 секунд збільшують затримку та ризик переривання на стороні глядача.
  • Відсутність обробки помилок завантаження: HTTP 4xx/5xx повинні приводити до повторної відправки сегмента з експоненційною затримкою.
  • Нехтування таблицями PAT/PMT: при ручному збиранні TS будь-яка помилка робить потік нечитабельним для плеєрів.

Наш досвід — 5+ років у мобільному стримінгу та понад 10 реалізованих проектів. Отримайте консультацію для оцінки вашого проекту. Зв'яжіться з нами — ми безкоштовно проаналізуємо вимоги та запропонуємо оптимальну архітектуру HLS-стримінгу з мобільного пристрою. Гарантуємо стабільну роботу та дотримання App Store Review Guidelines (iOS) та Google Play Політики.