Інтеграція трансляції в YouTube Live з мобільного додатка
YouTube Live — найпопулярніша платформа для публічного стримінга. Інтеграція з мобільного додатка означає: отримати RTMP endpoint користувача через YouTube Data API v3, запустити стрім з камери на цей endpoint і управляти трансляцією (старт, стоп, метадані) — все з вашого додатка, не з YouTube Studio.
YouTube Data API v3: отримання RTMP endpoint
Трансляція в YouTube — це два об'єкти: LiveBroadcast (подія з часом, назвою, настройками конфіденційності) і LiveStream (технічний потік з RTMP endpoint і stream key). Вони зв'язуються через bind.
Послідовність API викликів:
1. Авторизація. OAuth 2.0 scope: https://www.googleapis.com/auth/youtube. iOS: бібліотека AppAuth або ASWebAuthenticationSession. Android: SDK Google Sign-In або AppAuth-Android.
2. Створення LiveBroadcast:
POST https://www.googleapis.com/youtube/v3/liveBroadcasts?part=snippet,status,contentDetails
{
"snippet": {
"title": "Моя трансляція",
"scheduledStartTime": "2025-03-28T12:00:00Z"
},
"status": { "privacyStatus": "public" },
"contentDetails": { "enableAutoStart": true, "enableAutoStop": true }
}
enableAutoStart: true — трансляція почнеться автоматично при надходженні відео потока. Без цього потрібен окремий виклик transition API.
3. Створення 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://{ingestionAddress}/{streamName} — повний RTMP URL для стримінга.
Стрім на отриманий endpoint
Використовуємо HaishinKit (iOS) або rtmp-rtsp-stream-client-java (Android) — як в стандартному RTMP стримінгу. YouTube приймає H.264 + AAC.
Вимоги YouTube до потока:
- Відео: H.264, baseline/main/high profile, до 1080p60
- Аудіо: AAC-LC, 44.1 або 48 кГц, до 256 кбіт/с
- Максимальний бітрейт для 1080p30: ~6 Мбіт/с
- GOP (keyframe interval): 2 секунди максимум — важливо, інакше YouTube відхиляє потік
kVTCompressionPropertyKey_MaxKeyFrameInterval: 60 (для 30 fps = keyframe кожні 2 секунди) на iOS. Android: format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2).
YouTube не приймає RTMPS (TLS) на rtmps:// — тільки rtmp://. Важливо при настройці мережевих запитів на iOS (ATS вимагає HTTPS, але RTMP не HTTP — пишемо виключення в Info.plist для домена a.rtmps.youtube.com тільки якщо використовуєте RTMPS endpoint).
Управління трансляцією через API
Перевірка стану потока:
GET .../liveStreams?part=status&id={streamId}
status.streamStatus: inactive → testing → active. Після active трансляція видна глядачам (при enableAutoStart: true).
Завершення трансляції:
POST .../liveBroadcasts/transition?broadcastStatus=complete&id={broadcastId}&part=id,status
Оновлення метаданих під час трансляції (назва, опис):
PUT .../liveBroadcasts?part=snippet
Polling статусу: запрашуємо кожні 5 секунд поки streamStatus != active. Не частіше — YouTube API квота 10000 одиниць/день, liveStreams.list коштує 1 одиницю.
Превью трансляції у додатку
YouTube надає monitorStream.embedHtml — embed URL трансляції. Вбудовуємо через WKWebView / WebView для переглядання затримав потока (YouTube додає 5–20 секунд затримки). Для переглядання «себе» без затримки — використовуємо превью з камери локально.
Лічильник глядачів: GET .../videos?part=liveStreamingDetails&id={broadcastId} → liveStreamingDetails.concurrentViewers. Запрашуємо кожні 30 секунд під час трансляції.
Квоти та обмеження
YouTube Data API квота: 10000 одиниць/день безплатно. Створення LiveBroadcast — 50 одиниць. Створення LiveStream — 50 одиниць. Polling liveStreams.list — 1 одиниця/запит. При активному використанні (багато трансляцій на день) потрібно подавати заявку на збільшення квоти в Google Cloud Console.
YouTube забороняє більш ніж 5 активних трансляцій одночасно на акаунт. Для SaaS-платформи з багатьма користувачами — кожний працює зі своїм акаунтом (OAuth від імені користувача), не від імені додатка.
Терміни: інтеграція OAuth + створення трансляції через API + запуск RTMP стрима + управління статусом — 3–4 робочих дні.







