Інтеграція YouTube Live з мобільного застосунку
Ми зіткнулися із задачею: дати користувачам мобільного застосунку можливість стрімити прямо на YouTube Live, минаючи YouTube Studio. Для цього потрібно було отримати RTMP endpoint через OAuth, запустити стрім з камери та керувати ним — все в рамках одного застосунку. YouTube Live — найпопулярніша платформа, але її інтеграція вимагає розуміння API та мережевих особливостей. Наприклад, неправильне налаштування GOP призводить до відхилення потоку, а квота API швидко вичерпується при частих запитах. Опишемо технічний процес: отримання RTMP endpoint через YouTube Data API v3, запуск стріму на цей endpoint та керування трансляцією.
Авторизація OAuth 2.0 та отримання RTMP endpoint
Трансляція в YouTube складається з двох об'єктів: LiveBroadcast (подія з часом, назвою, налаштуваннями) та LiveStream (технічний потік з RTMP URL та ключем). Вони зв'язуються через bind. Ось послідовність викликів:
-
Авторизація: OAuth 2.0 з scope
https://www.googleapis.com/auth/youtube. На iOS використовуємо AppAuth або ASWebAuthenticationSession; на Android — Google Sign-In або AppAuth-Android. - Створення LiveBroadcast:
POST https://www.googleapis.com/youtube/v3/liveBroadcasts?part=snippet,status,contentDetails { "snippet": { "title": "Моя трансляція", "scheduledStartTime": "YYYY-MM-DDTHH:MM:SSZ" }, "status": { "privacyStatus": "public" }, "contentDetails": { "enableAutoStart": true, "enableAutoStop": true } } - Створення LiveStream:
POST https://www.googleapis.com/youtube/v3/liveStreams?part=snippet,cdn { "snippet": { "title": "Mobile Stream" }, "cdn": { "frameRate": "30fps", "ingestionType": "rtmp", "resolution": "1080p" } } Відповідь повертає ingestionInfo.ingestionAddress (RTMP URL) та ingestionInfo.streamName (stream key). 4. Bind:
POST .../liveBroadcasts/bind?id={broadcastId}&part=id,snippet&streamId={streamId} Підсумковий RTMP URL: rtmp://{ingestionAddress}/{streamName}.
Які вимоги до відео для YouTube Live?
Для відправки відео на YouTube використовуємо HaishinKit (iOS) або rtmp-rtsp-stream-client-java (Android). YouTube приймає H.264 + AAC. Вимоги до потоку:
| Параметр | Значення |
|---|---|
| Відеокодек | H.264 (baseline/main/high) |
| Максимальна роздільна здатність | 1080p60 |
| Аудіокодек | AAC-LC, 44.1/48 кГц, ≤256 кbps |
| Максимальний бітрейт | ~6 Mbps (1080p30) |
| GOP (keyframe interval) | ≤2 секунди |
Важливо: GOP має бути не більше 2 секунд, інакше YouTube відхиляє потік. На iOS це kVTCompressionPropertyKey_MaxKeyFrameInterval: 60 (для 30 fps); на Android — format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2). Також пам'ятайте: YouTube не приймає RTMPS — тільки RTMP. На iOS налаштуйте ATS, додавши виключення для домену a.rtmps.youtube.com (тільки якщо використовуєте RTMPS).
Як відстежувати статус трансляції?
Перевірка стану потоку:
GET .../liveStreams?part=status&id={streamId} status.streamStatus проходить стадії: inactive → testing → active. Після active трансляція видна глядачам (якщо enableAutoStart: true).
Завершення трансляції:
POST .../liveBroadcasts/transition?broadcastStatus=complete&id={broadcastId}&part=id,status Polling статусу: кожні 5 секунд до active, потім раз на 30 секунд для concurrentViewers. Враховуйте квоту: 10 000 одиниць/день; liveStreams.list коштує 1 одиницю.
Докладніше про квоту API
Кожен запит до YouTube Data API v3 споживає одиниці квоти. Наприклад, `liveBroadcasts.list` коштує 2 одиниці. Для мобільних стрімів ми рекомендуємо використовувати проксі-сервер для кешування відповідей та зменшення навантаження. Докладніше в офіційній документації (YouTube Data API Quota).Налаштування GOP та бітрейту
Неправильний GOP призводить до відхилення потоку. Ми налаштовуємо ключові кадри кожні 2 секунди та бітрейт не вище 6 Mbps для 1080p. Це гарантує стабільну трансляцію без дропів. Наприклад, для застосунку спортивних трансляцій ми налаштували GOP у 2 секунди та бітрейт 5 Mbps, що дозволило стабільно транслювати 1080p30 без збоїв, а час затримки скоротився з 4 до 2 секунд.
Порівняння RTMP та HLS
RTMP забезпечує затримку в 2-3 рази менше порівняно з HLS, що критично для прямих ефірів. HLS зручний для відтворення на плеєрах, але для трансляцій RTMP залишається стандартом. У таблиці нижче — порівняння протоколів:
| Протокол | Затримка | Підтримка на мобільних | Рекомендоване використання |
|---|---|---|---|
| RTMP | 2-5 сек | Відмінна (нативна) | Прямі ефіри |
| HLS | 10-30 сек | Добра (через плеєри) | Відео за запитом |
Що входить в інтеграцію?
- Аналіз вимог та поточної архітектури застосунку.
- Проектування інтеграції: вибір стеку (HaishinKit / rtmp-rtsp-stream-client), налаштування OAuth.
- Реалізація: написання коду для створення трансляцій, стрімінгу, керування.
- Тестування на реальних пристроях з контролем квоти та статусу.
- Документація: опис API-викликів та інструкції для підтримки.
- Підтримка після запуску: моніторинг та оновлення.
Орієнтири за строками та вартістю
Строки реалізації: від 3 до 5 робочих днів залежно від складності. Вартість інтеграції визначається після аналізу. На одному з проєктів завдяки оптимізації параметрів ми скоротили час запуску трансляції на 60%, що дозволило замовнику зменшити витрати на розробку.
Переконайтеся, що ваш застосунок відповідає політикам App Store Review та Google Play Console: трансляції не повинні порушувати авторські права, і потрібна явна згода користувача на використання камери.
Зв'яжіться з нами для оцінки вашого проєкту — ми маємо понад 5 років досвіду в мобільній розробці та більше 10 проєктів зі стрімінгом. Замовте інтеграцію зараз та отримайте консультацію щодо оптимізації потоків.







